В предложении Typecast решает все простые проблемы, поэтому вы можете сосредоточиться на больших. Typecast исправляет ошибки Javascript, создавая полную платформу для строго типизированных переменных в Javascript.

отрим пустой массив JavaScript:

var a = [];
alert(a == false); // shows true
alert(!a); // shows false!

Как это объяснить? Каковы правила?

 Evgenyt07 янв. 2011 г., 15:35
Спасибо за указание. Но не совсем, я прошу общие правила.
 Šime Vidas07 янв. 2011 г., 18:18
Или, если вы хотите, чтобы все было просто, просто избегайте принуждения типов. Там могут быть некоторые хорошие случаи использования для принуждения (==), но, как правило, этого можно просто избежать (===). И затем вы можете опираться на это правило и добавлять исключения в тех случаях, когда вы хотите принудительно применить.
 SLaks07 янв. 2011 г., 15:25
 user11371607 янв. 2011 г., 15:39
Когда дело доходит до свободных== оператор, правила не такие общие. Вы должны прочитать Алгоритм сравнения абстрактного равенства, на который ссылаетсяэтот ответ.
 dreftymac20 июн. 2014 г., 03:44
смотрите также: stackoverflow.com/questions/24318654

Ответы на вопрос(5)

что это отвечает на вопрос, но есть новая библиотека для обхода всех странностей Javascript Typecasting:

Typecast.js

В предложении Typecast решает все простые проблемы, поэтому вы можете сосредоточиться на больших. Typecast исправляет ошибки Javascript, создавая полную платформу для строго типизированных переменных в Javascript.

== Оператор, когда один из операндов, если Boolean, преобразует тип в число.

Эквивалентно:

0 == 0;

Вы можете увидеть полную информацию оАлгоритм сравнения абстрактного равенства по спецификации.

Как видите, пустой объект массива при преобразовании в Number создает0:

+[]; // 0
Number(0);

Это действительно потому, что его метод toString создает пустую строку, например:

[].toString(); // ""

+""; // 0
Number(""); // 0
Решение Вопроса

http://forums.whirlpool.net.au/archive/966449:

a == false:

В этом случае тип левой стороны - объект, тип правой стороны - логический. Javascript сначала преобразует логическое число в число, давая0, Затем он преобразует объект в «примитив», получая пустую строку. Затем он сравнивает пустую строку с0, Пустая строка преобразуется в число, что приводит к0, который численно равен0 с правой стороны, поэтому результат всего выраженияtrue.

См. §11.9.3ECMAScript спецификация для всех кровавых деталей.

(!a):

В этом случае Javascript преобразует объект в логическое значение true, а затем инвертирует его, что приводит к значению false.

 JKirchartz23 февр. 2015 г., 20:32
Вот прямая ссылка на вышеупомянутую спецификацию ECMA:ecma-international.org/ecma-262/5.1/#sec-11.9.3

При сравнении объекта с примитивным значением через== оператор, объект приводит к самому примитивному значению (число или строка). В этом случае[] принуждает в0, тогдаfalse принуждает в0:

[] == false
0 == false
0 == 0

что является правдой.

! оператор приводит к логическому, а затем инвертирует значение.[] в логическое значениеtrue (как с любым объектом). Затем инвертировать, чтобы статьfalse

![]
!true
false

! Оператор проверяет, является ли его операнд ложным.

Следующее верно:

!false!0!null!NaN!undefined!""

== Оператор проверяет свободное равенство, которое не имеет ничего общего с ложностью.

В частности,a == b преобразует в операнды в числа, а затем сравнивает числа.
Строки, содержащие числа, преобразуются в числа, которые они содержат; логическое преобразование в0 а также1.
Объекты конвертируются путем вызоваvalueOfесли определено.

Таким образом, все следующее верно:

"1" == 1"0" == false"1" == true"2" != true"2" != false({ valueOf:function() { return 2; } }) == 2({ valueOf:function() { return 1; } }) == true
 qwertymk07 янв. 2011 г., 15:58
Как ("2"! = True), ("2"! = False) оба истинны?
 SLaks07 янв. 2011 г., 16:11
@qwerty: так же, как2 != 3 а также2 != 4 оба верны
 qwertymk07 янв. 2011 г., 16:12
О, потому что false == Число (0), true == Число (1). Понял, спасибо

Ваш ответ на вопрос