### 1. Q: 解释下 JavaScript 中 `this` 是如何工作的。
A: `this` 在 JavaScript 中主要由以下五种使用场景。
* 作为函数调用,`this` 绑定全局对象,浏览器环境全局对象为 window 。
* 内部函数内部函数的 `this` 也绑定全局对象,应该绑定到其外层函数对应的对象上,这是 JavaScript的缺陷,用`that`替换。
* 作为构造函数使用,`this` 绑定到新创建的对象。
* 作为对象方法使用,`this` 绑定到该对象。
* 使用`apply`或`call`调用 `this` 将会被显式设置为函数调用的第一个参数。
参考阅读:
[深入浅出 JavaScript 中的 this](http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/#ibm-pcon)
[this 的工作原理](http://bonsaiden.github.io/JavaScript-Garden/zh/#function.this)
### 2. Q: 描述以下变量的区别:`null`,`undefined` 或 `undeclared`?
* 该如何检测它们?
A: `undefined`是Js语言类型,而`undeclared`是一种Js语法错误。在JavaScript中,有两个表示‘空’的值`undefined`和`null`,`undefined`是一个值为`undefined` 的类型。JavaScript语言也定义了一个全局变量,它的值是 `undefined`,这个变量也被称为`undefined`。 但是这个变量不是一个常量,也不是一个关键字。这意味着它的值可以轻易被覆盖。为了避免可能对`undefined`值的改变,一个常用的技巧是使用一个传递到匿名包装器的额外参数。在调用时,这个参数不会获取任何值。如下例子:
~~~
var undefined = 123;
(function(something, foo, undefined) {
// 局部作用域里的 undefined 变量重新获得了 `undefined` 值
})('Hello World', 42);
~~~
### 3. Q:请指出 JavaScript 宿主对象和原生对象的区别?
A: 宿主对象是指DOM和BOM。原生对象是Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、Math等对象。
### 4.Q:请尽可能详尽的解释 AJAX 的工作原理。
Ajax 全称为 Asynchronous JavaScript and XML(异步 JavaScript 和 XML),是一种创建交互式网页应用的网页开发技术。 Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后用 JavaScript来操作 DOM 而更新页面。这其中最关键的一步就是从服务器获得请求数据。
以往我们浏览网页的原理是由 Client 向 Server 提交页面申请,再由 Server 将申请通过 HTTP 传回给 Client 生成浏览页面:
使用 Ajax 后的工作原理如下图,可见通过 Ajax 在用户交互方面有了很大改进,用户可以不用为提交了 Form 而长时间等待服务器应答,而且通过 Ajax 也可以开发出华丽的 Web 交互页面。
### 5.Q:`==` 和 `===` 有什么不同?
A: `==`(相等运算法),`===`(严格相等运算符) JavaScript 对象的比较是引用的比较,非值的比较,对象和其本身相等,和其他任何对象不相等。 `===` 首先计算其操作数的值,然后比较,比较过程无任何类型转换。 `==` 如果两个操作数不是同一类型的,则相等运算符进行一些类型转换进行比较。
### 6.Q:请说出你可以传递给 jQuery 方法的四种不同值。
选择器(字符串),HTML(字符串),回调函数,HTML元素,对象,数组,元素数组,jQuery对象等。
### 7.Q:XMLHttpRequest通用属性和方法
1. `readyState`:表示请求状态的整数,取值:
* UNSENT(0):对象已创建
* OPENED(1):open()成功调用,在这个状态下,可以为xhr设置请求头,或者使用send()发送请求
* HEADERS\_RECEIVED(2):所有重定向已经自动完成访问,并且最终响应的HTTP头已经收到
* LOADING(3):响应体正在接收
* DONE(4):数据传输完成或者传输产生错误
3. `onreadystatechange`:readyState改变时调用的函数
4. `status`:服务器返回的HTTP状态码(如,200, 404)
5. `statusText`:服务器返回的HTTP状态信息(如,OK,No Content)
6. `responseText`:作为字符串形式的来自服务器的完整响应
7. `responseXML`: Document对象,表示服务器的响应解析成的XML文档
8. `abort()`:取消异步HTTP请求
9. `getAllResponseHeaders()`: 返回一个字符串,包含响应中服务器发送的全部HTTP报头。每个报头都是一个用冒号分隔开的名/值对,并且使用一个回车/换行来分隔报头行
10. `getResponseHeader(headerName)`:返回headName对应的报头值
11. `open(method, url, asynchronous [, user, password])`:初始化准备发送到服务器上的请求。method是HTTP方法,不区分大小写;url是请求发送的相对或绝对URL;asynchronous表示请求是否异步;user和password提供身份验证
12. `setRequestHeader(name, value)`:设置HTTP报头
13. `send(body)`:对服务器请求进行初始化。参数body包含请求的主体部分,对于POST请求为键值对字符串;对于GET请求,为null
### 8.Q:javascript有哪些方法定义对象
1. 对象字面量: `var obj = {};`
2. 构造函数: `var obj = new Object();`
3. Object.create(): `var obj = Object.create(Object.prototype);`
### 9.Q:对象到字符串的转换步骤
1. 如果对象有toString()方法,javascript调用它。如果返回一个原始值(primitive value如:string number boolean),将这个值转换为字符串作为结果
2. 如果对象没有toString()方法或者返回值不是原始值,javascript寻找对象的valueOf()方法,如果存在就调用它,返回结果是原始值则转为字符串作为结果
3. 否则,javascript不能从toString()或者valueOf()获得一个原始值,此时throws a TypeError
### 10.Q:对象到数字的转换步骤
~~~
1. 如果对象有valueOf()方法并且返回元素值,javascript将返回值转换为数字作为结果
2. 否则,如果对象有toString()并且返回原始值,javascript将返回结果转换为数字作为结果
3. 否则,throws a TypeError
~~~
### 11.Q:请用代码写出(今天是星期x)其中x表示当天是星期几,如果当天是星期一,输出应该是"今天是星期一"
~~~
var days = ['日','一','二','三','四','五','六'];
var date = new Date();
console.log('今天是星期' + days[date.getDay()]);
~~~
### 12.Q:javascript有哪几种数据类型
六种基本数据类型
* undefined
* null
* string
* boolean
* number
* [symbol](https://developer.mozilla.org/en-US/docs/Glossary/Symbol)(ES6)
一种引用类型
* Object
### 13.Q:javascript跨域通信
同源:两个文档同源需满足
1. 协议相同
2. 域名相同
3. 端口相同
跨域通信:js进行DOM操作、通信时如果目标与当前窗口不满足同源条件,浏览器为了安全会阻止跨域操作。跨域通信通常有以下方法
* 如果是log之类的简单**单项通信**,新建`<img>`,`<script>`,`<link>`,`<iframe>`元素,通过src,href属性设置为目标url。实现跨域请求
* 如果请求**json数据**,使用`<script>`进行jsonp请求
* 现代浏览器中**多窗口通信**使用HTML5规范的targetWindow.postMessage(data, origin);其中data是需要发送的对象,origin是目标窗口的origin。window.addEventListener('message', handler, false);handler的event.data是postMessage发送来的数据,event.origin是发送窗口的origin,event.source是发送消息的窗口引用
* 内部服务器代理请求跨域url,然后返回数据
* 跨域请求数据,现代浏览器可使用HTML5规范的CORS功能,只要目标服务器返回HTTP头部\*\*`Access-Control-Allow-Origin: *`\*\*即可像普通ajax一样访问跨域资源
* Javascript作用链域?
~~~js
全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。
当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,
直至全局函数,这种组织形式就是作用域链。
~~~
### 14.Q:谈谈This对象的理解。
### 15.Q:什么是window对象? 什么是document对象?
### 16.Q:看看下面运行结果?
~~~js
window.onload=function(){
var a=1+"1";//11
var b="1"+1;//11
var c="abc"+12+5+"def";//abc125def
var d="abc"+(12+5)+"def";//abc17def
}
~~~
### 17.Q:eval是做什么的?
~~~html
它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
~~~
### 18.Q:jquery中如何将数组转化为json字符串,然后再转化回来?
~~~js
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
//然后调用:
$("#xxx").stringifyArray(array)
~~~
### 19.Q:documen.write和 innerHTML的区别
~~~html
document.write只能重绘整个页面
innerHTML可以重绘页面的一部分
~~~