使用 Object.create(null) 代替大括號生成({})對象

傳統對象寫法爲 var obj = {} 這種寫法等價於 var obj = Object.create(Object.prototype) ,因此 {} 並非真正的空對象,它還經過原型鏈繼承了 Object 的屬性方法。性能

這種方式很差地方是,{} 在某些時候會進行隱式類型轉型,還有當咱們使用 for...in 時候會遍歷原形鏈上的屬性方法,以下面的代碼所示。spa

Object.prototype.test = 'test';
var obj = {};
console.log((obj + 0).length); // 16
for (var i in obj) {
  console.log(i); // 輸出 test
}

當對象和數值進行運算的時候會對對象進行隱式轉換,{} + 1 就變成了 [object Object] + 0 因此計算結果的長度爲 16。prototype

for...in 進行遍歷的時候也會遍歷原型鏈可枚舉的屬性,因此當遍歷的時候還須要使用 hasOwnProperty 進行過濾操做。code

Object.create(null) 沒有這樣的問題,是一個沒有繼承 Object 原型的屬性和方法的純對象。對象

var obj = Object.create(null)
obj + obj  // Uncaught TypeError: Cannot convert object to primitive value
obj  + 1 // Uncaught TypeError: Cannot convert object to primitive value

性能方面,以下圖,在之前使用 Object.create(null) 會有性能問題(比 {} 慢了不少倍),而如今已經不是問題了,並且更快了。blog

image

因此推薦你們使用 Object.create(null) 代替大括號生成({})對象。繼承

相關文章
相關標籤/搜索