回答
的抽象比較(==
)規則ES5 11.9.3描述而對於邏輯運算符(&&
)中的規則ES5 11.11中描述。
總之,==
只比&&
複雜。其中&&
僅使用內部ToBoolean()
來評估其操作數,==
具有可能導致使用ToBoolean()
,ToNumber()
和/或ToPrimitive()
的各種條件。
(0 == false) == true
:7.如果Type(y)爲布爾型,返回比較的結果X == ToNumber(y)的
ToNumber(false) === 0
,所以0 == 0
,所以true
。('0' == false) == true
:這也通過步驟7,導致
'0' == 0
。然後,在頂部開始過,它到達步驟5:
5.如果Type(x)的字符串和類型(y)爲數量, 返回的比較ToNumber的結果(X )== y。
ToNumber('0') === 0
,如此反覆0 == 0
,再次true
。!!(true && 0) == false
&&
簡單地返回第一個操作數,如果它是falsy(ToBoolean(...) === false
),或者第二個操作數。這是嚴格的
(true && 0) === 0
。而且,當作爲
if
條件使用時,結果(0
)也將是passed throughToBoolean(...)
和ToBoolean(0) === false
。!!(true && '0') == true
這再次返回第二個操作數,
'0'
。然而這次
ToBoolean('0') === true
爲'0'
是非空字符串,因此它是truthy。
另外,如果你想更簡單的比較規則,使用嚴格比較(===
,11.9.6)。
'(true &&'0')== true'實際上是錯誤的(因爲''' 0'!= true')。如果你想強調真實性和「ToBoolean」操作,你最好使用'!!(true &&'0')' – Bergi
'0'(或任何非空字符串)在JS中是'truthy'。然而,==操作符會執行一些奇怪的類型強制操作,這就是爲什麼許多傑出的JS人物,包括Crockford高度不鼓勵它的原因。這是一個很好的例子,爲什麼你應該避免它,它需要字符串'0'並將它強制爲一個虛假的值。
下面是解釋了這個過程的鏈接:
http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html
If Type(x) is Boolean, return the result of the comparison
ToNumber(x) == y: false == 0 and true == 1 but true != 2
比你的例子因此更奇怪的是:
('1' == true) // true
('2' == true) // false!
Au contraire mon ami,它絕對與==和它的強制效果有關。我從未提及過===所以不確定你的評論來自哪裏。 –
- 1. 比較運算符!==對0
- 2. 與布爾運算符
- 3. 與布爾運算符
- 4. 與布爾運算符
- 5. 邏輯運算符||在JavaScript中,0代表布爾錯誤?
- 6. 布爾運算符的位運算符
- 7. COUNT(*)0布爾場
- 8. 與布爾運算符擴展EvalMath
- 9. 布爾運算符++
- 10. SQL Server布爾運算符
- 11. matlab布爾運算符
- 12. 爲布爾運算符
- 13. 計數布爾運算符
- 14. 布爾賦值運算符
- 15. 標準SQL布爾運算符IS與等於(=)運算符
- 16. 布爾運算VS位運算符
- 17. 布爾運算符問題
- 18. 布爾賦值運算符
- 19. Thymeleaf - 布爾運算符
- 20. 布爾運算符鍛鍊
- 21. 蟒3.5使用布爾運算符
- 22. 尾遞歸和布爾運算符
- 23. Python的就地布爾運算符
- 24. 布爾運算符和雙運算符重載
- 25. 運算符| =在C++的布爾
- 26. IndexError:布爾指數與尺寸爲0的索引數組不匹配0
- 27. 布爾運算在Ruby中
- 28. Php布爾運算錯誤?
- 29. 需要使用0與三元運算符進行澄清
- 30. 布爾運算符和邏輯運算符
相等比較的操作數遵循一定的規則。用你的前兩個例子,它們被轉換成數字,因此是平等的。使用'&&'和'||',對操作數進行真實性測試。唯一錯誤的值是'false','0',''''','null','undefined'和'NaN'。希望這可以幫助:http://es5.github.io/#x11.9.3 – Ian
idk關於你,但是當我輸入'(true && 0)'到控制檯時,我得到了'0',當我做'(true && '0')'我得到''0'' – aug
@aug我認爲它們或多或少被用在'if'語句中 – Ian