Согласно документации Mozilla относительно [1 111] Операторы сравнения JavaScript
, Если эти два операнда не имеют того же типа, JavaScript преобразовывает операнды, затем применяет строгое сравнение. Если или операнд является числом или булевской переменной, операнды преобразовываются в числа; если любой операнд является строкой, другой преобразовывается в строку
, Что на самом деле происходит, то, что строки преобразовываются в числа. Например:
1 == '1'
становится 1 == Number('1')
, становится 1 == 1
: true
Затем попытка этот: 1 == '1.'
становится 1 == Number('1.')
, становится 1 == 1
: true
, Если бы они становились строками, затем Вы добрались бы '1' == '1.'
, который был бы ложью.
Это именно так происходит, что Number('') == 0
, поэтому 0 == ''
верен
Когда JavaScript сделает неявные преобразования типов, литерал пустой строки будет соответствовать 0 целым числам. Сделайте свое сравнение как это, и Вы получите свой ожидаемый результат:
alert(1==='') ==> false
alert(0==='') ==> false
alert(-1==='') ==> false
ECMA-262, 3-й выпуск, 11.9.3 относительно x == y
, шаг 16:
, Если Типом (x) является Число и Тип (y), Строка, возвратите результат сравнения x == ToNumber (y).
пустая строка ''
преобразовывается в 0
перед сравнением.
Это - только одно из действительно отвратительных искажений, которые вошли в компромисс JavaScript. '' и 0 оба неинициализированные значения (равный булевой лжи) и, поэтому, равный.
Для защиты себя от странных ошибок как это лучше всегда использовать === оператор.
JavaScript, как PHP, слабо typed*. Таким образом, когда Вы выдерживаете сравнение 0 с'', механизм JS преобразовывает их в подобный тип данных. С тех пор 0 и '' оба приравниваются к булевской переменной (ложь), "ложь == ложь" верна.
*Weakly типизированные языки не требуют, чтобы переменные были любым определенным типом данных, таким образом, можно установить одну переменную как строку, изменить его на интервал, плавание, и назад представить в виде строки без ошибок броска процессора.
На многих языках пустая строка может быть принуждена ко лжи.
Остерегаются выполнения сравнений с == вместо ===:
alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true
== не является переходным.