Объяснение для РЕДАКТИРОВАТЬ раздела вопроса:
1-й пример
[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!
Первое приведение типа [0] к примитивному значению согласно приведенному выше ответу Кристофа: «0» ([0].valueOf().toString()
)
"0" == false
Теперь введите тип Boolean (false) для Number, а затем String ("0") для Number
Number("0") == Number(false)
or 0 == 0
so, [0] == false // true
Что касается оператора if
, если в самом условии if нет явного сравнения, условие оценивается для истинных значений.
Есть только 6 ложных значений : false, null, undefined, 0, NaN и пустая строка "". И все, что не является ложной ценностью, является истинной ценностью.
Поскольку [0] не является ложным значением, это истинное значение, оператор if
принимает значение true и выполняет оператор.
2-й пример
var a = [0];
a == a // true
a == !a // also true, WTF?
Снова введите приведение значений к примитиву,
a = a
or [0].valueOf().toString() == [0].valueOf().toString()
or "0" == "0" // true; same type, same value
a == !a
or [0].valueOf().toString() == [0].valueOf().toString()
or "0" == !"0"
or "0" == false
or Number("0") == Number(false)
or 0 = 0 // true