04.07.2012, 10:44
|
Интересующийся
|
|
Регистрация: 14.07.2011
Сообщений: 26
|
|
Проблемы с преобразованием типов.
Скажите, почему следующий код:
alert('NaN'==NaN);
alert('undefined'==undefined);
alert('null'==null);
Во всех трёх случаях выводит false, хотя должен бы true....
И почему следующий код вообще ничего не выводит:
alert('dump'++);
alert(typeof d);
|
|
04.07.2012, 10:50
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
|
|
04.07.2012, 13:47
|
Интересующийся
|
|
Регистрация: 14.07.2011
Сообщений: 26
|
|
Ну и что? Всё равно не понятно....Объясните мне почему, например,
'NaN'==NaN не верно? NaN преобразуется в строку как 'NaN'. Тогда почему они не равны? Почему alert('dump'++); ничего не выводит, хотя никаких ошибок в консоль не выводится?
|
|
04.07.2012, 14:21
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
dump, книжки нужно читать...
Цитата:
|
Еще одно специальное числовое значение возвращается JavaScript, когда мате
матическая операция (например, деление нуля на ноль) приводит к неопреде
ленному результату или ошибке. В этом случае результатом является специаль
ное значение «нечисло», обозначаемое как NaN. «Нечисло» (NotaNumber) ведет
себя необычно: оно не равно ни одному другому числу, в том числе и самому себе!
По данной причине для проверки на это значение имеется специальная функция
isNaN(). Похожая функция, isFinite(), позволяет проверить число на неравенст
во NaN или положительной/отрицательной бесконечности.
|
Цитата:
|
Ключевое слово null в JavaScript имеет специальный смысл. Обычно считается,
что у значения null объектный тип и оно говорит об отсутствии объекта. Значе
ние null уникально и отличается от любых других. Если переменная равна null,
следовательно, в ней не содержится допустимого объекта, массива, числа, стро
ки или логического значения.1
|
Цитата:
|
Еще одно специальное значение, иногда используемое в JavaScript, – undefined.
Оно возвращается при обращении либо к переменной, которая была объявлена,
но которой никогда не присваивалось значение, либо к свойству объекта, кото
рое не существует. Заметьте, что специальное значение undefined – это не то же
самое, что null.
Хотя значения null и undefined не эквивалентны друг другу, оператор эквива
лентности == считает их равными. Рассмотрим следующее выражение:
my.prop == null
Это сравнение истинно, либо если свойство my.prop не существует, либо если оно
существует, но содержит значение null. Поскольку значение null и undefined обо
значают отсутствие значения, это равенство часто оказывается тем, что нам
нужно. Однако когда действительно требуется отличить значение null от значе
ния undefined, нужен оператор идентичности === или оператор typeof (подробнее
об этом в главе 5).
В отличие от null, значение undefined не является зарезервированным словом
JavaScript. Стандарт ECMAScript v3 указывает, что всегда существует глобаль
ная переменная с именем undefined, начальным значением которой является зна
чение undefined. Следовательно, в реализации, соответствующей стандарту, un
defined можно рассматривать как ключевое слово, если только этой глобальной
переменной не присвоено другое значение.
|
Твои примеры, в некоем смысле, можно представить как
var test=0;
alert('test'==test);
Последний раз редактировалось ksa, 04.07.2012 в 14:27.
|
|
04.07.2012, 15:35
|
Интересующийся
|
|
Регистрация: 14.07.2011
Сообщений: 26
|
|
Сообщение от Дзен-трансгуманист
|
Тип этих значений не приводится к строковому, чтобы не было холостых срабатываний.
Хотя alert('NaN'==NaN.toString()); будет true
|
Не совсем понятно, каких именно холостых срабатываний? Можете привести пример?
Цитата:
|
alert('dump'++); - пишет в консоль "Ошибка: invalid increment operand"
alert(typeof d); - выводит "undefined"
|
А вы какой программой пользуетесь для запуска скрипта? У меня в firebug'е и мозиле не выводится...
|
|
05.07.2012, 01:54
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от dump
|
alert('NaN'==NaN);
|
Если в операторе "==" операнды число и строка, то строка перед сравнением приводится в число. В данном случае 'NaN' приводится к NaN, а оно не равно самому себе. В справочнике ошибка, там написано, что "если какой-либо операнд строка - второй преобразуются в строку", хотя это неверно.
Цитата:
|
alert('undefined'==undefined);
alert('null'==null);
|
При нестрогом сравнении undefined считается равным null, но эти значения не равны никакому другому значению.
Сообщение от dump
|
А вы какой программой пользуетесь для запуска скрипта? У меня в firebug'е и мозиле не выводится...
|
У меня в Firebug'е при выполнении alert('dump'++); выводит прямо в консоль "SyntaxError: invalid increment operand".
Последний раз редактировалось oneguy, 05.07.2012 в 02:23.
|
|
05.07.2012, 13:48
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
ВНИМАНИЕ ПРАВИЛЬНЫЙ ОВТЕТ
Сообщение от dump
|
Скажите, почему следующий код:
alert('NaN'==NaN);
alert('undefined'==undefined);
alert('null'==null);
Во всех трёх случаях выводит false, хотя должен бы true....
|
потому что не undefined приводится к строке, а строка приводится к чему-то и undefined приводится к чем у то общему, пустая строка приведется к "false", не пустая строка приведется к "true", undefined приведется к false
ТИПА того
Сообщение от dump
|
alert('dump'++);
|
ошибка, строку нельзя увеличить на один
Сообщение от dump
|
alert(typeof d);
|
ошибка, переменная d не найдина
Последний раз редактировалось Drimogemon, 05.07.2012 в 13:52.
|
|
05.07.2012, 15:59
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от Drimogemon
|
Сообщение от dump
alert('dump'++);
ошибка, строку нельзя увеличить на один
|
var str = '1';
alert(str);
str++;
alert(str + '; ' + typeof(str))
str += '';
alert(str + '; ' + typeof(str))
|
|
05.07.2012, 19:35
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
bes,
млять строку можно увеличить на один если она может преобразоваться к числу, не знаешь что ли как пост инкримент работает? очевидно же что имеется ввиду строка в значении "текст".
Последний раз редактировалось Drimogemon, 05.07.2012 в 19:37.
|
|
05.07.2012, 20:10
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от Drimogemon
|
ошибка, строку нельзя увеличить на один
|
Сообщение от Drimogemon
|
bes,
млять строку можно увеличить на один если она может преобразоваться к числу, не знаешь что ли как пост инкримент работает? очевидно же что имеется ввиду строка в значении "текст".
|
Здесь экстрасенсов мало, а очевидное иногда бывает далеко не очевидным, млякать вообще не стоит, здесь культурный форум (ну или я его себе таким представляю )
|
|
|
|