Почему "0" == [] false?

console.log( 0 == '0' );     // true
console.log( 0 == [] );     // true 
console.log( [] == '0' );    // false

Ответ 1

Короче говоря, число 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"));

Ответ 2

/*
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

Ответ 3

Трути и фальши Как и тип, каждое значение также имеет встроенное логическое значение, обычно называемое либо правдивым, либо ложным. Некоторые из правил немного странны, поэтому понимание концепций и эффектов при сравнении помогает при отладке приложений JavaScript.

Следующие значения всегда ложны:

  • ложь
  • 0 (ноль)
  • '' или "" (пустая строка)
  • NULL
  • undefined
  • NaN (например, результат 1/0)

Все остальное правдиво. Это включает в себя:

  • '0' (строка, содержащая один ноль)
  • 'false' (строка, содержащая текст "false" )
  • [] (пустой массив)
  • {} (пустой объект)
  • function() {} ( "пустая" функция)

Неожиданные ситуации могут возникать при сравнении правдоподобных и ложных значений с использованием равенства == free:

См. таблицу сравнений равновесия

Таблица для сравнения свободного равенства с ==

Ответ 4

JavaScript использует тип Type Conversion, чтобы принудить любое значение к булевому в контексте, который ему нужен, например, условные и циклы.

В первом случае

console.log( 0 == '0'); 

javascript использует coerceing и конвертирует как число, так и сравнивает. Теперь 0 == 0, так возвращается true.

Во втором случае

console.log( 0 == [] );

Оба являются ложными (значение ложности - это значение, которое переводит в false при оценке в булевом контексте). Итак, теперь, сравнивая false == false, возвращается истинное значение.

В третьем случае

console.log( [] == '0'); 

[] является ложным, а "0" - строкой, js не может принуждать их преобразовывать тип, который можно сравнить. поэтому возвращается false.