2009-10-07 2 views

ответ

15

Оператор === - ваш друг. Никогда не используйте оператор ==; он вас укусит, как вы можете видеть.

+9

Хотя ваш ответ полезным он не дает ответа на вопрос. –

+3

Правда. Значения «false»: undefined, null, false, 0 и «". Как говорит майккамуэль, [] принуждает к "". Так много для первого. И ссылка на ненулевой объект верна, что отвечает на вторую. –

10

Пустой список, [] должен считаться «ложным», однако в ![]! затем преобразует операцию для проверки ссылки на объект , где непустой не считается «ложным».

+5

[] не является ложным. Это побочный эффект принуждения струн. Массив [''] также == false, но не является ложным. –

+0

@mikesamuel спасибо за понимание! – Dave

4

Прежде чем [] сравнивается с ложным, его принуждают к строке, которая принуждается к числу, пустой строке в случае пустого массива. Пустая строка объединяется в 0, которая является тем же значением, что и ложные когерентности, численно.

Использование === вместо ==, чтобы избежать этой проблемы

Эти другие массивы также falsey:

[''] 
    [[[]]] 
    (function() { var arr = []; arr[0] = arr; })() 
    [0] 
    ['-0.0'] 
+0

Почему список будет принудительно привязан к строке по сравнению с логическим значением? Любые источники? – luntain

+0

Из раздела 11.9.3 EcmaScript 262: 18. Если тип (x) является логическим, верните результат сравнения ToNumber (x) == y. 19. Если тип (y) булев, верните результат сравнения x == ToNumber (y). Тогда принудительное преобразование массива в число состоит из первого принуждения его к строке и последующего принуждения этой строки к числу. Для большинства массивов это даст несопоставимое значение NaN, но для некоторых массивов [], [0], [[0]], ['0.0'] и т. Д. Они будут честно сравнивать с ложными. Вы можете экспериментировать с действием принуждения, оценивая (+ [0]) и т. Д. –

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