Почему javascript обрабатывает 0 равным пустой строке?
Возможный дубликат:
Предполагаемое сравнение строк, 0 = '', но 1 = '1'
Выполняя следующий случай в javascript, я получаю 0 равным '' (пустая строка)
var a = 0;
var b = '';//empty string
if(a==b){
console.log('equal');//this is printed in console
}else{
console.log('not equal');
}
Может ли кто-нибудь объяснить, в чем причина этого?
Ответы
Ответ 1
Цитата doc (MDN):
Равный (==)
Если два операнда не одного типа, JavaScript преобразует операнды затем применяют строгое сравнение. Если либо операнд - это число или логическое значение, операнды, если возможно, преобразуются в числа; еще если любой операнд является строкой, другой операнд преобразуется в если возможно.
Как a
тип операнда здесь Number
, b
также преобразуется в Number. И Number('')
оценивается как 0
.
Иногда это может быть довольно неожиданно. Рассмотрим это, например:
console.log(0 == '0'); // true
console.log(0 == ''); // true
console.log('' == '0'); // O'RLY?
... или это:
console.log(false == undefined); // false
console.log(false == null); // false
console.log(null == undefined); // fal.... NO WAIT!
... и именно поэтому почти всегда рекомендуется использовать оператор ===
(строгое равенство).
Ответ 2
0
, ""
(Empty String), false
все технически имеют одно и то же значение при приведении типов. Если вам нужно строго их обрабатывать, вы можете использовать ===
.
То же самое происходит с аналогичными языками программирования, такими как PHP.
var a = 0;
var b = ''; //empty string
if(a == b){
console.log('equal'); //this is printed in console
}else{
console.log('not equal');
}
Чтобы сделать строгое сравнение:
if(a === b){
console.log('equal');
}else{
console.log('not equal'); //this is printed in console
}
Ответ 3
Оператор ==
в javascript не сравнивает типы, поэтому 0=='' === true
(потому что как числовая строка ''
оценивается как 0) или 0==false === true
(поскольку bool false
оценивается как 0
) для сравнения типов к вам можно использовать оператор ===
.
Здесь вы найдете полезную информацию о сравнении.
Ответ 4
Javascript автоматически преобразует переменные разных типов для сравнения. Это общая черта в не строго типизированных языках.
Если вам нужно сравнить переменные и проверить тип, используйте оператор ===
.
Ответ 5
В большинстве языков программирования (включая javascript) ""
(string), 0
(integer), \x0
(null) означает одно и то же: "empty". Что происходит, ваш движок javascript находит "" == 0
false, из-за ==
он преобразует 0
в целое число. Опять же, это неверно, поэтому он преобразует 0
в null, что является ложным, поэтому он преобразует 0
в пустую строку. (Не уверен, что это правильный порядок преобразования). Чтобы сделать условие "точное" совпадение (без преобразования), используйте ===
inplace ==
Ответ 6
Поскольку пустая строка, представленная как число, равна нулю. Если вы сравниваете яблоки и апельсины, вы должны думать о том, как выглядел бы ваш оранжевый цвет, если бы это было яблоко.
Ответ 7
Из-за принуждения. Обычно лучше использовать ===
для сравнения в JavaScript.
Ответ 8
Поскольку ==
проверяет равенство значений, поэтому false
, 0
и пустые строки равны. Используйте проверку идентификации ===
.
Ответ 9
== делает приведение типов. Всегда используйте ===.
В вашем примере пустая строка b преобразуется в 0. Таким образом, и a, и b являются одинаковыми.