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 如何判斷兩個對象相等
能夠轉換爲字符串來判斷。舉例:javascript
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 操做符的過程當中,執行了如下四個步驟:java
- 新生成一個對象;
- 連接到原型:
let obj = new Object();
let Con = [].shift.call(arguments);
obj.__proto__ = Con.prototype
- 綁定 this: apply;
- 返回新對象;
用一句話來講就是:數組
new 操做符新建了一個空對象,這個對象原型指向構造函數的prototype,執行構造函數後返回這個對象。app
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()的搭配來實現深拷貝。舉例:this
let a = {
age: 1,
jobs: {
first: 'FE'
}
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE
- jQuery的extend()方法 因爲如今項目中用jQuery相對較少,用到的時候能夠單獨去查該API。
- 遞歸 這個主要是針對對象的元素不是一維元素,元素自己可能也爲對象或者數組,甚至子元素的子元素也是對象或者數組的時候,從根本上去實現深拷貝。