簡體   English   中英

為什么1+ []在JavaScript中返回“1”?

[英]Why does 1+[ ] return “1” in JavaScript?

最近有一位朋友問我一個問題:

![]+1+[]+false

在評價后,我以直覺行事,我回答了2 但是當我在瀏覽器控制台中嘗試表達式時,我得到的輸出是"1false"

對我來說奇怪的部分是1+[] ,評價為"1"

我無法理解為什么會這樣,它是如何工作的?

有人可以解釋一下嗎?

謝謝

添加數字和對象,嘗試將對象轉換為基元。 為此,它在對象上調用.toString() ,在這種情況下調用空數組,對於調用.join()[].join()數組調用"" ,因此1 + []是與"1"相同。

另請注意,添加內容從左到右。

 (![]) + 1 + [] + false // objects are truthy, therefore *not object* is false
 (false + 1) + [] + false // boolean gets coerced to number, and false is 0
 (0 + 1) + [] + false // 0 + 1 is 1
 (1 + []) + false // .valueOf() as described above
 (1 + "") + false
 "1" + false
 "1false"

由於JavaScript是一種弱類型語言,因此當您將運算符應用於不同類型的值時,也可以自動在不同類型之間轉換值,並將其稱為隱式類型強制。

一般來說算法如下:

  1. 如果輸入已經是原語,則不執行任何操作並將其返回。
  2. 調用input.toString(),如果結果是原始的,則返回它。
  3. 調用input.valueOf(),如果結果是原始的,則返回它。
  4. 如果input.toString()和input.valueOf()都不生成原語,則拋出TypeError。

數字轉換首先調用valueOf(3)並回退到toString(2)。
字符串轉換相反:toString(2)后跟valueOf(3)。

+運算符觸發數字轉換。

所以valueOf將被調用為空數組,這只是空數組。 [].valueOf() // [] 由於valueOf不是原始的,它將調用[].toString() //""

所以1 + []將轉換為1 + ""

由於其中一個操作數是字符串操作符,因此字符串轉換為1。

所以1 + ""將轉換為"1" + ""

因此你得到輸出"1"

如果至少一個操作數是字符串類型,則另一個操作數轉換為字符串並執行連接。

所以在這種情況下1+ [] -

[] .toString()給出空字符串,1將被字符串化,你得到輸出“1”

進一步的錯誤也將被字符串化並且“1”+ false =“1false”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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