摘要:傳統對象寫法為這種寫法等價于,所以并不是真正的空對象,它還通過原型鏈繼承了的屬性方法。輸出當對象和數值進行運算的時候會對對象進行隱式轉換,就變成了所以計算結果的長度為。所以推薦大家使用代替大括號生成對象。
傳統對象寫法為 var obj = {} 這種寫法等價于 var obj = Object.create(Object.prototype) ,所以 {} 并不是真正的空對象,它還通過原型鏈繼承了 Object 的屬性方法。
這種方式不好地方是,{} 在某些時候會進行隱式類型轉型,還有當我們使用 for...in 時候會遍歷原形鏈上的屬性方法,如下面的代碼所示。
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。
for...in 進行遍歷的時候也會遍歷原型鏈可枚舉的屬性,所以當遍歷的時候還需要使用 hasOwnProperty 進行過濾操作。
而 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) 會有性能問題(比 {} 慢了很多倍),而現在已經不是問題了,而且更快了。
所以推薦大家使用 Object.create(null) 代替大括號生成({})對象。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89982.html
摘要:字符串的擴展字符的表示法允許采用形式表示一個字符,其中表示字符的碼點。返回布爾值,表示參數字符串是否在源字符串的頭部。使用和這兩個常量,用來表示這個范圍的上下限。對于那些無法用個二進制位精確表示的小數,方法返回最接近這個小數的單精度浮點數。 字符串的擴展 字符的 Unicode 表示法 JavaScript 允許采用uxxxx形式表示一個字符,其中xxxx表示字符的 Unicode 碼...
摘要:上面代碼中,分別是字符串布爾值和數值,結果只有字符串合入目標對象以字符數組的形式,數值和布爾值都會被忽略。 1 數組的擴展 http://es6.ruanyifeng.com/#do... 1.1 擴展運算符 2 對象的擴展 http://es6.ruanyifeng.com/#do... 2.1 屬性的簡潔表示法 ES6 允許直接寫入變量和函數,作為對象的屬性和方法。這樣的書寫更加簡...
摘要:在中,寫成類的本質基本都是構造函數原型。操作符左邊是待檢測類的對象,右邊是定義類的構造函數。不宜用在這里,我們需要知道的幾種定義類的方法,除了上面的構造函數外,還有方法用這個方法,類就是一個對象,而不是函數。 js類的基本含義 我們知道,在js中,是沒有類的概念的。類的所有實例對象都從同一個原型對象上繼承屬性,因此,原型對象是類的核心。 類是對象的抽象,而對象是類的具體實例。類是抽象的...
摘要:命令命令的作用,就是執行構造函數,返回一個實例對象。實例對象相當于創建一個空的構造函數,將其屬性指向參數對象,從而實現讓該實例繼承的屬性。 這是ES5的入門篇教程的筆記,網址:JavaScript教程,以下內容中黑體表示大標題,還有一些重點;斜體表示對于自身,還需要下功夫學習的內容。這里面有一些自己的見解,所以若是發現問題,歡迎指出~ 實例對象與new命令面向對象編程是目前主流的編程范...
閱讀 1991·2023-04-26 01:41
閱讀 2468·2021-11-24 09:39
閱讀 1922·2021-11-24 09:38
閱讀 1947·2021-11-19 09:40
閱讀 3760·2021-11-11 11:02
閱讀 3294·2021-10-20 13:48
閱讀 3157·2021-10-14 09:43
閱讀 4360·2021-09-02 15:11