CodeMash 2012 的「Wat」演講揭示了 JavaScript 中的一些令人費解的行為。在這裡,我們深入研究底層機制並解釋 JSFiddle 範例中觀察到的結果。
[] + [] result: ""
連接數組產生的空字串突出顯示運算符轉換兩個操作數都為基元,在數組上調用 toString()。對於空數組,此轉換會產生一個空字串。
[] + {} result: [Object]
像之前一樣,將空數組轉換為基元給我們一個空字串。但是,使用其 toString() 方法將該物件強制轉換為字串,從而產生「[Object]」。字串與空字串連接,產生「[Object].」
{} + [] result: [Object]
此處的{} 被解釋為空區塊,從而產生空基元價值。然後,該運算子嘗試透過 toString() 將物件轉換為字串,從而得到「[Object]」。然而,這種行為是一種異常行為,因為影片表明結果應該為 0。
{} + {} result: [Object][Object]
與前面的情況類似,物件被強制轉換為字串。但是,由於沒有一元運算符,因此結果不會轉換為數字。相反,傳回「[Object]」和「[Object]」的串聯。
result: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
減去一個數字字串結果為 NaN。當作為參數傳遞給 Array.join 時,轉換為字串(透過 toString())會產生「NaN」。然後陣列的 join() 方法重複連接這個字串,從而得到觀察到的結果。
這些特殊的行為源自於將值轉換為基元的特定規則和運算子的行為在 JavaScript 中。雖然其中一些可能看起來違反直覺,但了解底層機制可以讓開發人員在自己的程式碼中更好地預測和處理這些怪癖。
以上是為什麼 JavaScript 在新增陣列和物件時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!