Пустой массив - false, но в выражении IF он возвращает true
Это возвращает true:
[] == false
Но здесь вызывается предупреждение:
if([]){ alert('empty array is true here'); }
Можете ли вы объяснить, почему?
Ответы
Ответ 1
это связано с тем, что ==
в преобразовании JS-сил и если один тип может быть преобразован в другое, возвращаемое значение true
, а здесь, потому что []
невозможно изменить или сравнить с bool, это неверно
где as if([])
проверяет значения null
и undefined
, и поскольку [] не является ни нулевым, ни undefined, он возвращает true
проверить это
Какой оператор равен (== vs ===) должен использоваться при сравнении JavaScript?
Ответ 2
Согласно разделу 11.9.3 ECMAScript & reg; Language Specification, любое сравнение ==
выполняется следующим образом:
- Если тип (x) совпадает с типом (y), то
- Если тип (x) равен Undefined, верните true.
- Если Type (x) - Null, верните true.
- Если Type (x) - Number, то
- Если x является NaN, верните false.
- Если y является NaN, верните false.
- Если x - это то же значение числа, что и y, верните true.
- Если x равно +0 и y равно -0, верните true.
- Если x равно -0 и y равно +0, верните true.
- Возвращает false.
- Если Type (x) - String, тогда верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях). В противном случае верните false.
- Если Type (x) является логическим, верните true, если x и y оба true или оба false. В противном случае верните false.
- Возвращает true, если x и y относятся к одному и тому же объекту. В противном случае верните false.
- Если x равно null, а y - Undefined, верните true.
- Если x равно undefined, а y - null, верните true.
- Если Type (x) - Number и Type (y) - String,
верните результат сравнения x == ToNumber (y).
- Если Type (x) - String, а Type (y) - Number,
возвращает результат сравнения ToNumber (x) == y.
- Если Type (x) является логическим, верните результат сравнения ToNumber (x) == y.
- Если тип (y) является логическим, верните результат сравнения x == ToNumber (y).
- Если Type (x) является строкой или номером, а Type (y) - Object,
возвращает результат сравнения x == ToPrimitive (y).
- Если Type (x) - это Object и Type (y) - либо String или Number,
верните результат сравнения ToPrimitive (x) == y.
- Возвращает false.
На первом этапе ToNumber()
применяется к false
и дает Number(0)
. На втором шаге правило # 9 применяет ToPrimitive()
к пустому массиву и дает ""
, который, преобразованный в числовое значение, также становится Number(0)
.
Дополнительно раздел 9.2 говорит об использовании объекта в выражении:
Абстрактная операция ToBoolean
преобразует свой аргумент в значение типа Boolean в соответствии с этой таблицей:
- Undefined → false
- Null → false
- Boolean → Результат равен входному аргументу (без преобразования).
- Number → Результат равен false, если аргумент равен +0, -0 или NaN; иначе результат будет правдой.
- String → Результат является ложным, если аргумент является пустой строкой (ее длина равна нулю); иначе результат будет правдой.
- Объект → true