打字在Chrome控制檯:js鑄造和類型強制 - 爲什麼!! {} [true]不正確?
{}[true] // [true] (object)
!!{}[true] // false (boolean)
爲什麼!! {} [真]不正確時{} [真]是什麼?
打字在Chrome控制檯:js鑄造和類型強制 - 爲什麼!! {} [true]不正確?
{}[true] // [true] (object)
!!{}[true] // false (boolean)
爲什麼!! {} [真]不正確時{} [真]是什麼?
假設這些語句在自己的立場:
{}[true]
被解釋爲
{} // empty block
[true] // array literal expression
所以,如果你在控制檯輸入這個,最後一條語句的結果打印出來,這是一個包含數組一個元素,布爾值true
。
!!{}[true]
另一方面被解釋爲訪問空對象的屬性'true'
。這將返回undefined
,並在轉換爲布爾值時轉換爲false
。
你如何評價{}[true]
?實際上這是undefined
,因爲空對象沒有名爲'true'
的屬性。很顯然undefined
不是true
。
UPD:我在谷歌Chrome開發者工具檢查,並...
{}[true] // [true]
!!{}[true] // false
console.log({}[true]) // undefined
第一行是[true]
因爲其中會涉及2個語句。第一個是空塊({}
),第二個是一個包含一個元素(true)的數組。相反,第二行評估爲表達式(以及第三個參數),至{}
,這裏不再是一個塊,而是一個空對象。
@ san.chez,如果我們假設'{}'是一個對象,那麼是的,它是。如果我們假設它只是javascript代碼,那麼它沒有任何價值,因爲有兩條語句(javascript沒有任何last-statement-value-is-statement-statement-list功能)。 – 2013-04-10 12:03:29
+1我希望在這種情況下可以接受多於一個的答案 – 2013-04-10 13:13:26
這取決於上下文。當JavaScript分析器在它認爲它的代碼塊的遊戲內看到{}
,不反對,從而有效地{}[true]
相同[true]
而事實上,在控制檯:
> {}[true]
[true]
但
> x = {}[true];
undefined
因爲{}
不在開始或
> ({}[true])
undefined
因爲()
迫使JS to trea它就像一個表達。
如果JavaScript的解析器看到在{}
面前的東西它解釋{}
爲對象,從而在控制檯:
> !!{}[true]
true
*「如果JavaScript解析器在{}之前看到某些內容」*:not for {{} {} [true]'; – 2013-04-10 12:01:14
@FelixKling是的,再右邊,它有點簡化。 :)但一般的想法或多或少是正確的。 – freakish 2013-04-10 12:01:50
{}[true] => true (object)
不是一個真正的Boolean對象。如果有的話,它返回一個數組 - 一個布爾值true。當{}
被解釋爲(空)塊(參見Why {} != ({}) in JavaScript?),並且第二個語句[true]
是數組文字時,會發生這種情況。如果試圖
({}[true])
// or
({})[true]
(或者迫使它以某種其他方式被評價爲表達式)訪問一個空的對象,它是undefined
的"true"
屬性。這發生在你的第二個情況下,也:
!!{}[true] => false (boolean)
爲!!
要挾被解釋爲對象文本的{}
。而!undefined
是true
,所以!!undefined
將產生false
。
+1我希望在這種情況下可以接受更多的答案 – 2013-04-10 13:14:25
這是完整的代碼還是條件語句的一部分? '{} [true]'本身不會導致'true'。 – 2013-04-10 11:55:47
[true for me](http://jsfiddle.net/xQpU7/)。 – 2013-04-10 11:56:51
@ShadowWizard:parens是關鍵。 – 2013-04-10 12:04:14