Подтвердить что ты не робот

Пустой массив - false, но в выражении IF он возвращает true

Это возвращает true:

[] == false

Но здесь вызывается предупреждение:

if([]){ alert('empty array is true here'); }

Можете ли вы объяснить, почему?

4b9b3361

Ответ 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