2013-09-26 2 views
3

На днях я столкнулся с интересной ошибкой. Я тестировал массив, чтобы увидеть, если она оценивается в логическое значение FALSE, однако только непосредственно оценивать это всегда возвращала верно:Булевая оценка массивов JavaScript

> !![] 
    true 

Хорошо, так что в принципе любой массив, который я поставил там будет true независимо, не так ли? Я запускаю это в консоли JavaScript только для удовольствия:

> [] == true 
    false 

Что здесь происходит?

+1

Об этих проблемах, я думаю, вам понравится этот разговор: https://www.destroyallsoftware.com/talks/wat –

+0

Возможно, вы захотите взглянуть на этот вопрос для своего ответа: http: // stackoverflow .com/questions/5491605/javascript-empty-array-кажется-to-be-true-and-false-at-same-time – Steve

+0

Вы посмотрели мой ответ? – plalx

ответ

1

Это связано с The Abstract Equality Comparison Algorithm по сравнению с алгоритмом, используемым для преобразования значения в булево.

Глядя на the spec, мы можем видеть, что точка номер 9. является единственным, который определяет, что должно происходить, когда Тип (слева значение) Объект. Однако он указывает, что правое значение должно быть либо строкой, либо номером.

9. Если Type (x) является Object и Type (y) является либо String, либо Number, возвращает результат сравнения ToPrimitive (x) == y.

Глядя на [] == true:

typeof [] является 'object' поэтому мы хорошо, но typeof true не 'string' или 'number', это 'boolean', так что возврат к последней инструкции, номер точки 10.

10. Вернуть false.

Однако !![] переводит в !!Boolean([]), и поскольку [] является значением thruty (объекты), это то же самое, как написание !!true, который возвращает true.

Смежные вопросы