2013-04-10 58 views
3

打字在Chrome控制檯:js鑄造和類型強制 - 爲什麼!! {} [true]不正確?

{}[true] // [true] (object) 
!!{}[true] // false (boolean) 

爲什麼!! {} [真]不正確時{} [真]是什麼?

+0

這是完整的代碼還是條件語句的一部分? '{} [true]'本身不會導致'true'。 – 2013-04-10 11:55:47

+0

[true for me](http://jsfiddle.net/xQpU7/)。 – 2013-04-10 11:56:51

+0

@ShadowWizard:parens是關鍵。 – 2013-04-10 12:04:14

回答

7

假設這些語句在自己的立場:

{}[true]被解釋爲

{} // empty block 
[true] // array literal expression 

所以,如果你在控制檯輸入這個,最後一條語句的結果打印出來,這是一個包含數組一個元素,布爾值true

!!{}[true]另一方面被解釋爲訪問空對象的屬性'true'。這將返回undefined,並在轉換爲布爾值時轉換爲false

8

你如何評價{}[true]?實際上這是undefined,因爲空對象沒有名爲'true'的屬性。很顯然undefined不是true

UPD:我在谷歌Chrome開發者工具檢查,並...

{}[true] // [true] 
!!{}[true] // false 
console.log({}[true]) // undefined 

第一行是[true]因爲其中會涉及2個語句。第一個是空塊({}),第二個是一個包含一個元素(true)的數組。相反,第二行評估爲表達式(以及第三個參數),至{},這裏不再是一個塊,而是一個空對象。

+1

@ san.chez,如果我們假設'{}'是一個對象,那麼是的,它是。如果我們假設它只是javascript代碼,那麼它沒有任何價值,因爲有兩條語句(javascript沒有任何last-statement-value-is-statement-statement-list功能)。 – 2013-04-10 12:03:29

+0

+1我希望在這種情況下可以接受多於一個的答案 – 2013-04-10 13:13:26

4

這取決於上下文。當JavaScript分析器在它認爲它的代碼塊的遊戲內看到{},不反對,從而有效地{}[true]相同[true]而事實上,在控制檯:

> {}[true] 
[true] 

> x = {}[true]; 
undefined 

因爲{}不在開始或

> ({}[true]) 
undefined 

因爲()迫使JS to trea它就像一個表達。

如果JavaScript的解析器看到在{}面前的東西它解釋{}爲對象,從而在控制檯:

> !!{}[true] 
true 
+1

*「如果JavaScript解析器在{}之前看到某些內容」*:not for {{} {} [true]'; – 2013-04-10 12:01:14

+0

@FelixKling是的,再右邊,它有點簡化。 :)但一般的想法或多或少是正確的。 – freakish 2013-04-10 12:01:50

3
{}[true] => true (object) 

不是一個真正的Boolean對象。如果有的話,它返回一個數組 - 一個布爾值true。當{}被解釋爲(空)塊(參見Why {} != ({}) in JavaScript?),並且第二個語句[true]是數組文字時,會發生這種情況。如果試圖

({}[true]) 
// or 
({})[true] 

(或者迫使它以某種其他方式被評價爲表達式)訪問一個空的對象,它是undefined"true"屬性。這發生在你的第二個情況下,也:

!!{}[true] => false (boolean) 

!!要挾被解釋爲對象文本的{}。而!undefinedtrue,所以!!undefined將產生false

+0

+1我希望在這種情況下可以接受更多的答案 – 2013-04-10 13:14:25