[英]what is the overhead of wrapping primitives as objects in javascript?
[英]What happens when we treat primitives as objects in JavaScript?
我正在從javascript.info學習 JS。 現在我正在閱讀有關基本方法的方法。
當我們運行以下代碼時
let str = 'hello';
alert( str.toUpperCase() ); // HELLO
在內部發生以下情況 (1) 創建一個特殊對象 (2) 復制 str 變量的值 (3) 修改復制的版本 (4) 在不觸及原始 str 變量的情況下返回復制的版本 (5) 最后該特殊對象被銷毀.
作者是這么說的。 但是當我們有這樣的事情時
let str = 'Hello';
console.log(str.toUpperCase()); // HELLO
console.log(str.split('l')); // (3) ["He", "", "o"]
console.log(str.startsWith('h')); // false
console.log(str.concat(' JavaScript')); // Hello JavaScript
console.log(str); // Hello
我只是想知道,每次我們將原始對象視為對象時,是否都會創建一個特殊對象? 從上面的代碼,我認為整個過程(創建一個對象,做一些過程並銷毀)做了4次(因為我調用了4個方法)。
真的嗎?
我也從中讀到了以下內容
JavaScript 引擎高度優化了這個過程。 它甚至可能完全跳過額外對象的創建。 但是它仍然必須遵守規范並且表現得好像它創建了規范一樣。
這是什么意思? 以上幾行讓我更加困惑整個過程完成了多少次。
我只是想知道,每次我們將原始對象視為對象時,是否都會創建一個特殊對象? 我想整個過程做了4次,因為我調用了4個方法。
是的,這是真的。
JavaScript 引擎高度優化了這個過程。 它甚至可能完全跳過額外對象的創建。 但是它仍然必須遵守規范並且表現得好像它創建了規范一樣。
這是什么意思?
這意味着創建 4 個對象是一種浪費——一個就足夠了,而且您仍然會得到相同的結果(在這種情況下)。 該規范以“行為好像”的方式編寫,它沒有規定 javascript 引擎的實現需要如何逐步工作,而只是規定了它需要具有哪些可觀察的行為。 如果一個引擎足夠聰明,可以發現它可以跳過一個步驟,例如做不必要的副本或創建未使用的對象,只要執行結果仍然相同,就可以這樣做。
對於原始值的方法調用,這是一個相對簡單的優化——引擎不需要在內存中實際分配一個對象,它可以直接跳到在假設的特殊對象上查找屬性的步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.