2012-06-11 79 views
3

我有這樣的產量在控制檯:很奇怪的行爲比較不確定的和虛假的

console.log((!undefined)==(!false)) // true (fine) 
console.log((!!undefined)==(!!false)) // true (still fine) 

據我所知,!!x==x,不是嗎?

console.log((undefined)==(false)) // false 

有誰能告訴我爲什麼這會返回false?

!!false==false!!undefined==undefined是不是真的?

+0

在像'!'這樣的邏輯運算符中使用時,未定義的值被強制爲'false':http://11heavens.com/falsy-and-truthy-in-javascript – apsillers

+0

任何引用(官方)這個? – skafandri

+0

[logical not operator](http://ecma-international.org/ecma-262/5.1/#sec-11.4.9),雖然'!undefined'當然是'true'。 – Esailija

回答

5

是。 !!x確實不是 return x。 !undefined脅迫undefined爲布爾false,然後查找!((bool)undefined) = !false,如果我們用C++鑄造符號。所以!!undefined給出!!((bool)undefined) = !!(false) = !true = false,而不是undefined

+0

突出顯示此行爲的任何(官方)參考? – skafandri

+0

更新你的信息花花公子:) – skafandri

+0

@skafandri:[The spec](http://ecma-international.org/ecma-262/5.1/)。 –

0

未定義不是boolean類型,如false因此,當您直接比較它們時,它們不相等。

查看here瞭解其他比較缺陷。

typeof(undefined) 
"undefined" 

typeof(false) 
"boolean" 
+1

把'false'與'undefined/null'比較時'=='vs'==='沒有什麼區別,即使比較之前所有東西都轉換爲相同類型,這種情況尤其沒有什麼區別。 – Esailija

+0

對不起,這不是我的意思。我更新了我的答案,使其更加清晰。 – sachleen

0
console.log(!undefined) 
// true 
console.log(!false) 
// true 
console.log(!!undefined) 
// false 
console.log(!!false) 
// false