簡體   English   中英

當我們將基元視為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM