![](/img/trans.png)
[英]Why is (([]===[])+/-/)[1] = 'a' and (1+{})[(1<<1)+1] = 'b' in javascript?
[英]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是一種弱類型語言,因此當您將運算符應用於不同類型的值時,也可以自動在不同類型之間轉換值,並將其稱為隱式類型強制。
一般來說算法如下:
數字轉換首先調用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.