Почему иJavascript Гоча: пустой список для булевой преобразования
[] == false
и
![] == false
истинны?
Почему иJavascript Гоча: пустой список для булевой преобразования
[] == false
и
![] == false
истинны?
Оператор === - ваш друг. Никогда не используйте оператор ==; он вас укусит, как вы можете видеть.
Пустой список, []
должен считаться «ложным», однако в ![]
! затем преобразует операцию для проверки ссылки на объект , где непустой не считается «ложным».
[] не является ложным. Это побочный эффект принуждения струн. Массив [''] также == false, но не является ложным. –
@mikesamuel спасибо за понимание! – Dave
Прежде чем [] сравнивается с ложным, его принуждают к строке, которая принуждается к числу, пустой строке в случае пустого массива. Пустая строка объединяется в 0, которая является тем же значением, что и ложные когерентности, численно.
Использование === вместо ==, чтобы избежать этой проблемы
Эти другие массивы также falsey:
['']
[[[]]]
(function() { var arr = []; arr[0] = arr; })()
[0]
['-0.0']
Почему список будет принудительно привязан к строке по сравнению с логическим значением? Любые источники? – luntain
Из раздела 11.9.3 EcmaScript 262: 18. Если тип (x) является логическим, верните результат сравнения ToNumber (x) == y. 19. Если тип (y) булев, верните результат сравнения x == ToNumber (y). Тогда принудительное преобразование массива в число состоит из первого принуждения его к строке и последующего принуждения этой строки к числу. Для большинства массивов это даст несопоставимое значение NaN, но для некоторых массивов [], [0], [[0]], ['0.0'] и т. Д. Они будут честно сравнивать с ложными. Вы можете экспериментировать с действием принуждения, оценивая (+ [0]) и т. Д. –
Хотя ваш ответ полезным он не дает ответа на вопрос. –
Правда. Значения «false»: undefined, null, false, 0 и «". Как говорит майккамуэль, [] принуждает к "". Так много для первого. И ссылка на ненулевой объект верна, что отвечает на вторую. –