Приведение типов JavaScript
13644 просмотра
5 ответа
Рассмотрим пустой массив JavaScript:
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
Как это объяснить? Каковы правила?
Автор: Evgenyt Источник Размещён: 13.11.2019 11:35Ответы (5)
12 плюса
С 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:228 плюса
В !
оператор проверяет , является ли его операнд является «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
4 плюса
==
Оператора , когда один из операндов , если логическое значение, тип преобразует другой к номеру.
[] == 0;
Эквивалентно:
0 == 0;
Вы можете увидеть полную информацию об Алгоритме сравнения абстрактного равенства в спецификации.
Как видите, пустой объект массива при преобразовании в Number создает 0
:
+[]; // 0
Number(0);
Это действительно потому, что его метод toString создает пустую строку, например:
[].toString(); // ""
+""; // 0
Number(""); // 0
Автор: CMS
Размещён: 07.01.2011 02:24
1 плюс
При сравнении объекта с примитивным значением с помощью ==
оператора объект принудительно превращается в примитивное значение (число или строка). В этом случае []
приводит к 0
, затем false
приводит к 0
:
[] == false
0 == false
0 == 0
что является правдой.
В !
оператор принуждают в булевы , а затем инвертирует значение. []
в логическое значение true
(как с любым объектом). Затем инвертировать, чтобы статьfalse
![]
!true
false
Автор: Šime Vidas
Размещён: 07.01.2011 02:23
0 плюса
Не уверен, что это отвечает на вопрос, но есть новая библиотека для обхода всех странностей Javascript Typecasting:
В предложении Typecast решает все простые проблемы, поэтому вы можете сосредоточиться на больших. Typecast исправляет ошибки Javascript, создавая полную платформу для строго типизированных переменных в Javascript.
Автор: BishopZ Размещён: 23.01.2013 04:26Вопросы из категории :
- javascript Как определить, какой из указанных шрифтов был использован на веб-странице?
- javascript Валидация клиентской стороны ASP.Net
- javascript Длина объекта JavaScript
- javascript Получение текста из выпадающего списка
- javascript Скрипт входа со скрытыми кнопками
- javascript Как автоматически изменить размер текстовой области с помощью Prototype?
- types Как создать новый экземпляр объекта из Типа
- types В чем разница между строкой и строкой в ??C #?
- types В чем разница между старым и новым стилем классов в Python?
- types Что хорошего в дженериках, зачем их использовать?
- types Что такое типы POD в C ++?
- types Какой канонический способ проверить тип в Python?
- casting Regular cast vs. static_cast vs. dynamic_cast
- casting Приведите int к перечислению в C #
- casting Синтаксические стили C ++
- casting Приведение списка <int> в список <string> в .NET 2.0
- casting Зачем использовать static_cast <int> (x) вместо (int) x?
- casting Прямое приведение против оператора "как"?