傳統對象寫法爲 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
因此推薦你們使用 Object.create(null) 代替大括號生成({})對象。繼承