JavaScript面試題總結系列(二)

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 操做符的過程當中,執行了如下四個步驟:
  1. 新生成一個對象;
  2. 連接到原型:
let obj = new Object();
let Con = [].shift.call(arguments);
obj.__proto__ = Con.prototype

3.綁定 this: apply;
4.返回新對象;java

用一句話來講就是:數組

new 操做符新建了一個空對象,這個對象原型指向構造函數的prototype,執行構造函數後返回這個對象。

2.6 淺拷貝和深拷貝

  • 什麼是淺拷貝,什麼是深拷貝?

淺拷貝和深拷貝,這裏一般是指將一個對象A賦值給另外一個變量B。當A修改的時候,若是B也跟着變化,這個就是淺拷貝,若是B沒有變化,這個叫作深拷貝。app

  • 淺拷貝能夠如何實現

能夠經過直接將對象賦值給變量的方式實現淺拷貝。舉例:函數

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方法:this

主要是經過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.遞歸
這個主要是針對對象的元素不是一維元素,元素自己可能也爲對象或者數組,甚至子元素的子元素也是對象或者數組的時候,從根本上去實現深拷貝。prototype

相關文章
相關標籤/搜索