Вопрос:

Приведение типов JavaScript

javascript types casting

13644 просмотра

5 ответа

4367 Репутация автора

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

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

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

Автор: Evgenyt Источник Размещён: 07.01.2011 02:19

Ответы (5)


12 плюса

5220 Репутация автора

Решение

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

a == false:

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

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

(!a):

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

Автор: Ryan Li Размещён: 07.01.2011 02:22

8 плюса

724872 Репутация автора

В !оператор проверяет , является ли его операнд является «falsy».

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

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

В ==операторе проверяет рыхлое равенство, которое не имеет ничего общего с falsiness.

В частности, 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
Автор: SLaks Размещён: 07.01.2011 02:23

1 плюс

127533 Репутация автора

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

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

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

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

![]
!true
false
Автор: Šime Vidas Размещён: 07.01.2011 02:23

4 плюса

637528 Репутация автора

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

[] == 0;

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

0 == 0;

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

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

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

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

[].toString(); // ""

+""; // 0
Number(""); // 0
Автор: CMS Размещён: 07.01.2011 02:24

0 плюса

4274 Репутация автора

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

Typecast.js

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

Автор: BishopZ Размещён: 23.01.2013 04:26
Вопросы из категории :
32x32