console.log( 0 == '0' ); // true
console.log( 0 == [] ); // true
console.log( [] == '0' ); // false
console.log( 0 == '0' ); // true
console.log( 0 == [] ); // true
console.log( [] == '0' ); // false
Короче говоря, число 0
является ложным, строка "0"
не является.
Однако JavaScript будет пытаться принуждать типы при использовании двойных равных. Таким образом, вы получаете истинное от этого
console.log( 0 == '0'); // true
Поскольку JavaScript принуждал оба числа.
Со следующим:
console.log( 0 == [] ); // true
Это немного запутанно, потому что пустой массив правдивый, а ноль - ложный. Однако, если вы принуждаете пустой массив к числу, вы получаете длину, которая равна нулю. Таким образом, это фактически оценивает 0 == 0
после привязки к числу.
И с этим:
console.log( [] == '0'); // false
JavaScript не может принуждать их к одному типу - и один из них ложный, а другой нет.
В общем, поэтому в целом безопаснее использовать тройные равенства, которые проверяют тип и равенство.
Удобная иллюстрация ниже
function truthyOrFalsy(val) {
return val ? "Truthy" : "Falsy";
}
console.log("empty array:", truthyOrFalsy([]));
console.log("number zeroL", truthyOrFalsy(0));
console.log("string with a zero character:", truthyOrFalsy("0"));
/*
If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
*/
console.log( 0 == '0');
/*
If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
*/
console.log( 0 == [] );
/*
If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
*/
console.log( [] == '0');
источник: http://es5.github.io/#x11.9.3
Трути и фальши Как и тип, каждое значение также имеет встроенное логическое значение, обычно называемое либо правдивым, либо ложным. Некоторые из правил немного странны, поэтому понимание концепций и эффектов при сравнении помогает при отладке приложений JavaScript.
Следующие значения всегда ложны:
Все остальное правдиво. Это включает в себя:
Неожиданные ситуации могут возникать при сравнении правдоподобных и ложных значений с использованием равенства == free:
См. таблицу сравнений равновесия
JavaScript использует тип Type Conversion, чтобы принудить любое значение к булевому в контексте, который ему нужен, например, условные и циклы.
В первом случае
console.log( 0 == '0');
javascript использует coerceing и конвертирует как число, так и сравнивает. Теперь 0 == 0, так возвращается true.
Во втором случае
console.log( 0 == [] );
Оба являются ложными (значение ложности - это значение, которое переводит в false при оценке в булевом контексте). Итак, теперь, сравнивая false == false, возвращается истинное значение.
В третьем случае
console.log( [] == '0');
[] является ложным, а "0" - строкой, js не может принуждать их преобразовывать тип, который можно сравнить. поэтому возвращается false.