Это связано с тем, что Javascript обрабатывает проверки равенства: вы можете проверить значение с неявным преобразованием типа с помощью ==
или проверить тип и значение с помощью ===
.
Это также означает, что список «falsish» значений оценки для false
по сравнению с ==
: ""
, 0
, undefined
, null
Сейчас: "" == "0"
сравнивает две строки, которые явно отличаются.
Беспорядочный вопрос, почему "0" == false
?
Это же делать с Javascript spec для ==
:
Если два операнда не одного и того же типа, JavaScript преобразует операндов затем применяет строгое сравнение.Если либо операндом является число , либо логическое значение, операнды преобразуются в номера, если возможно; else , если любой из операндов является строкой, другой операнд, если это возможно, преобразуется в строку . Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, равные, когда операнды ссылаются на на тот же объект в памяти.
Если сравнить "0"
в булево она сначала преобразуется в число, 0
, который является "falsish. Когда вы сравниваете "0"
со строкой, строки сравниваются.
Если преобразовать непосредственно (без использования ==
), то "0"
оценивается как истина:
if("0") console.log('Now "0" is true!')
Вы действуете так, как если бы не было документации по == –
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators –
'==' не является транзитивным, a == b' и 'b == c' не означает' a == c'. Алгоритм в spec [** здесь **] (http://es5.github.io/#x11.9.3); Биты, которые вы хотите: Если Type (x) является String, а Type (y) - Number, возвращает результат сравнения ToNumber (x) == y. ** и сравните это с ** Если Type (x) совпадает с типом (y), тогда If Type (x) является String, тогда верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одна и та же символов в соответствующих позициях). В противном случае верните false. –