Рассмотрим пустой массив JavaScript:
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
Как это объяснить? Каковы правила?
Рассмотрим пустой массив JavaScript:
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
Как это объяснить? Каковы правила?
Из http://forums.whirlpool.net.au/archive/966449:
a == false
:
В этом случае тип левой стороны - это объект, тип правой части - логический. Javascript сначала преобразует логическое значение в число, получая 0
. Затем он преобразует объект в "примитив", давая пустую строку. Затем он сравнивает пустую строку с 0
. Пустая строка преобразуется в число, получая 0
, который численно равен 0
в правой части, поэтому результат всего выражения true
.
См. §11.9.3 спецификацию ECMAScript для всех подробностей gory.
(!a)
:
В этом случае Javascript преобразует объект в логическое значение true, а затем инвертирует его, что приводит к ошибке.
Оператор !
проверяет, является ли его операнд "ложным".
Верно следующее:
!false
!0
!null
!NaN
!undefined
!""
Оператор ==
проверяет свободное равенство, которое не имеет ничего общего с ложностью.
В частности, a == b
преобразует в операнды числа, а затем сравнивает числа.
Строки, содержащие числа, преобразуются в числа, которые они содержат; booleans преобразуются в 0
и 1
.
Объекты преобразуются путем вызова valueOf
, если они определены.
Таким образом, все следующее верно:
"1" == 1
"0" == false
"1" == true
"2" != true
"2" != false
({ valueOf:function() { return 2; } }) == 2
({ valueOf:function() { return 1; } }) == true
Оператор ==
, когда один из операндов, если имеет значение Boolean, преобразовывает другое в число.
[] == 0;
Является эквивалентным:
0 == 0;
Вы можете увидеть полную информацию о Алгоритм сравнения абстрактного равенства в спецификации.
Как вы можете видеть, пустой объект массива при преобразовании в число производит 0
:
+[]; // 0
Number(0);
Это действительно потому, что его метод toString создает пустую строку, например:
[].toString(); // ""
+""; // 0
Number(""); // 0
При сравнении объекта с примитивным значением с помощью оператора ==
объект зацикливается на самом примитивном значении (число или строка). В этом случае []
заходит в 0
, тогда false
заходит в 0
:
[] == false
0 == false
0 == 0
что верно.
Оператор !
замыкается в boolean, а затем инвертирует значение. []
в boolean true
(например, с любым объектом). Затем инвертируйте, чтобы стать false
![]
!true
false
Не уверен, что это отвечает на вопрос, но есть новая библиотека для обхода всех неизвестных Javascript:
В предложении Typecast решает все простые проблемы, поэтому вы можете сосредоточиться на больших. Typecast исправляет ошибки в Javascript, создавая полную платформу для сильно типизированных переменных в Javascript.