2. JavaScript 对象
2.1 内置对象
- Object 是 JavaScript 中所有对象的父对象;
- 数据封装类对象:Object、Array、Boolean、Number、String;
- 其他对象:Function、Arguments、Math、Date、RegExp、Error、JSON、全局对象;
2.2 定义对象的方式
- 对象字面量: var obj = {};
- 构造函数: var obj = new Object();
- Object.create(); var obj = Object.create(Object.prototype);
2.3 通过 new 的方式和通过字面量的方式创建对象区别
- 通过字面量的方式创建对象,不会调用 Object()构造函数,简介并且性能更好;
- 通过 new 操作符创建对象时,需要调用 Object()构造函数,本质上是方法调用,涉及到在__proto__链中遍历该方法,当找到方法后,会产生调用方法必须的堆栈信息,方法结束后,需要释放堆栈,在性能上不如使用字面量的方式创建对象。
2.4 如何判断两个对象相等
可以转换为字符串来判断。举例:
obj = {
a: 1,
b: 2
}
obj2 = {
a: 1,
b: 2
}
obj3 = {
a: 1,
b: '2'
}
JSON.stringify(obj) == JSON.stringify(obj2);//true
JSON.stringify(obj) == JSON.stringify(obj3);//false
2.5 new 操作符
在调用 new 操作符的过程中,执行了以下四个步骤:
- 新生成一个对象;
- 链接到原型:
let obj = new Object();
let Con = [].shift.call(arguments);
obj.__proto__ = Con.prototype
3. 绑定 this: apply;
4. 返回新对象;
用一句话来说就是:
new 操作符新建了一个空对象,这个对象原型指向构造函数的 prototype,执行构造函数后返回这个对象。
2.6 浅拷贝和深拷贝
- 什么是浅拷贝,什么是深拷贝?
浅拷贝和深拷贝,这里通常是指将一个对象 A 赋值给另一个变量 B。当 A 修改的时候,如果 B 也跟着变化,这个就是浅拷贝,如果 B 没有变化,这个叫做深拷贝。
- 浅拷贝可以如何实现
可以通过直接将对象赋值给变量的方式实现浅拷贝。举例:
let a = [1, 2, 3];
let b = a;
a[0] = 4;
b[0] // 4
- 深拷贝可以如何实现
1.Object.assign(); 看个例子:
let a = {age: 1}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1
2. 展开运算符。举例:
let a = {age: 1}
let b = {...a}
a.age = 2
console.log(b.age) // 1
3.JSON 方法:
主要是通过 JSON.parse()和 JSON.stringify()的搭配来实现深拷贝。举例:
let a = {
age: 1,
jobs: {first: 'FE'}
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE
4.jQuery 的 extend()方法
由于现在项目中用 jQuery 相对较少,用到的时候可以单独去查该 API。
5. 递归
这个主要是针对对象的元素不是一维元素,元素本身可能也为对象或者数组,甚至子元素的子元素也是对象或者数组的时候,从根本上去实现深拷贝。