文章出處
文章列表
作者:知乎用戶
鏈接:https://www.zhihu.com/question/61106507/answer/184310938
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
鏈接:https://www.zhihu.com/question/61106507/answer/184310938
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
題主可能不會去看 spec,但是應該(甚至必須)看 JavaScript高級程序設計(第3版) (豆瓣),這本書的第三章非常完整地解釋了原因。
3.5.7 相等操作符
在轉換不同的數據類型時,相等和不相等操作符遵循下列基本規則:
1. 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false轉換為0,而true轉換為1;
2. 如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
3. 如果一個操作數是對象,另一個操作數不是,則調用對象的valueOf()方法,用得到的基本類型值按照前面的規則進行比較;
首先 'true' == true 符合規則 1,這樣就轉化成了對 'true' == 1 進行求值
此時表達式符合規則 2
2. 如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
也就是說需要將 'true' 轉換成數值之后,再與數字 1 進行比較。把 'true' 轉換成數值是使用 Number 函數
3.4.5 Number 類型
Number()函數的轉換規則如下。
1. 如果是Boolean值,true和false將分別被轉換為1和0。
2. 如果是數字值,只是簡單的傳入和返回。
3. 如果是null值,返回0。
4. 如果是undefined,返回NaN。
5. 如果是字符串,遵循下列規則:
5.1 如果字符串中只包含數字(包括前面帶加號或負號的情況),則將其轉換為十進制數值, 即"1"會變成1,"123"會變成123,而"011"會變成11(注意:前導的零被忽略了);
5.2 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
5.3 如果字符串中包含有效的十六進制格式,例如"0xf",則將其轉換為相同大小的十進制整數值;
5.4 如果字符串是空的(不包含任何字符),則將其轉換為0;
5.5 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN。
按照規則 5 和規則 5.5,Number('true') 的值為 NaN,也就是說現在的問題變成了對 NaN == 1 進行求值。
還是在這一節中,提到了
其次,NaN與任何值都不相等,包括NaN本身。
也就是說 NaN == 1 的值是 false。
最后捋一遍,'true' == true --> 'true' == 1 --> NaN == 1 --> false。
JavaScript 的 == 判斷符隱含著各種隱式轉換,對于這種設計上的坑,最好的避免方式就是不使用,沒有必要為語言的糟粕買單。
實際上,幾乎所有地方使用全等操作符 === 都更加有必要,如果分不清楚什么時候可以用相等操作符 ==,那就直接記住結論,統一使用全等操作符 ===。
文章列表
全站熱搜