元芳怎么了
2019-11-27 10:57:10
為什么以下兩個語句的結果不同?('0' ? 'a' : 'b') /* -> 'a' */('0' == true ? 'a' : 'b') /* -> 'b' */jsFiddle測試用例編輯:我應該補充一點,我懷疑將“ 0”第一條語句強制轉換為要比較的布爾值-這應該與“'0'== true”完全相同,顯然這是不正確的。
3 回答
慕娘9325324
TA貢獻1783條經驗 獲得超5個贊
首先,為了完整性:
('0' ? 'a' : 'b')
之所以為'a',是因為它'0'是一個非空字符串,其總值為true:
字符串:如果參數為空字符串(其長度為零),則結果為false;否則為false。否則結果為true。
現在到'0' == true。
這里將進行兩次類型轉換。我們可以在規范的第11.9.3節“抽象平等比較算法”中遵循這一要求。
操作數表示為x和y(x == y)。
在我們的例子中,x是一個字符串('0')和y一個布爾值(true)。因此,執行步驟7:
如果Type(y)為布爾型,則返回比較結果x == ToNumber(y)。
將布爾值轉換為數字時,將進行以下轉換:
布爾值:如果參數為true,則結果為1。如果參數為false,則結果為+0。
現在我們有
'0' == 1
符合步驟5中的條件:
如果Type(x)為String,Type(y)為Number,則返回比較結果ToNumber(x)== y。
如何將字符串轉換為數字更為復雜,但是當然也可以在規范中找到。
所以最后的比較是
0 == 1
這是false(步驟1. a。vi。)
紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
主要是因為JavaScript在真實性方面相當不一致。但是答案是:
在這種情況下,“ 0”直接轉換為布爾值,而“ 0”(非空字符串)為true。
在這種情況下,不會進行任何轉換;字符串不等于布爾值。
添加回答
舉報
0/150
提交
取消
