Подразумеваемое сравнение строк, 0 == '', но 1 == '1'

Я отлаживал что-то и обнаружил некоторую странность в JavaScript:

alert(1=='') ==> false
alert(0=='') ==> true
alert(-1=='') ==> false

Это имело бы смысл, что подразумеваемое сравнение строк, которое 0 должно = '0'. Это верно для всех ненулевых значений, но почему не для нуля?

17
задан Jack Bashford 3 July 2019 в 07:28
поделиться

6 ответов

Когда JavaScript сделает неявные преобразования типов, литерал пустой строки будет соответствовать 0 целым числам. Сделайте свое сравнение как это, и Вы получите свой ожидаемый результат:

alert(1==='') ==> false
alert(0==='') ==> false
alert(-1==='') ==> false
10
ответ дан 30 November 2019 в 11:27
поделиться

ECMA-262, 3-й выпуск, 11.9.3 относительно x == y, шаг 16:

, Если Типом (x) является Число и Тип (y), Строка, возвратите результат сравнения x == ToNumber (y).

пустая строка '' преобразовывается в 0 перед сравнением.

4
ответ дан 30 November 2019 в 11:27
поделиться

Это - только одно из действительно отвратительных искажений, которые вошли в компромисс JavaScript. '' и 0 оба неинициализированные значения (равный булевой лжи) и, поэтому, равный.

Для защиты себя от странных ошибок как это лучше всегда использовать === оператор.

3
ответ дан 30 November 2019 в 11:27
поделиться

JavaScript, как PHP, слабо typed*. Таким образом, когда Вы выдерживаете сравнение 0 с'', механизм JS преобразовывает их в подобный тип данных. С тех пор 0 и '' оба приравниваются к булевской переменной (ложь), "ложь == ложь" верна.

*Weakly типизированные языки не требуют, чтобы переменные были любым определенным типом данных, таким образом, можно установить одну переменную как строку, изменить его на интервал, плавание, и назад представить в виде строки без ошибок броска процессора.

2
ответ дан 30 November 2019 в 11:27
поделиться

На многих языках пустая строка может быть принуждена ко лжи.

Остерегаются выполнения сравнений с == вместо ===:

alert('' == '0'); //false  
alert(0 == ''); // true  
alert(0 =='0'); // true

== не является переходным.

2
ответ дан 30 November 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: