Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблемы с преобразованием типов. (https://javascript.ru/forum/misc/29584-problemy-s-preobrazovaniem-tipov.html)

dump 04.07.2012 10:44

Проблемы с преобразованием типов.
 
Скажите, почему следующий код:

alert('NaN'==NaN);
alert('undefined'==undefined);
alert('null'==null);

Во всех трёх случаях выводит false, хотя должен бы true....
И почему следующий код вообще ничего не выводит:
alert('dump'++);
alert(typeof d);

Deff 04.07.2012 10:50

http://javascript.ru/typeof

dump 04.07.2012 13:47

Цитата:

Сообщение от Deff (Сообщение 186189)

Ну и что? Всё равно не понятно....Объясните мне почему, например,
'NaN'==NaN не верно? NaN преобразуется в строку как 'NaN'. Тогда почему они не равны? Почему alert('dump'++); ничего не выводит, хотя никаких ошибок в консоль не выводится?

ksa 04.07.2012 14:21

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);

dump 04.07.2012 15:35

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 186260)
Тип этих значений не приводится к строковому, чтобы не было холостых срабатываний.
Хотя alert('NaN'==NaN.toString()); будет true

Не совсем понятно, каких именно холостых срабатываний? Можете привести пример?

Цитата:

alert('dump'++); - пишет в консоль "Ошибка: invalid increment operand"
alert(typeof d); - выводит "undefined"
А вы какой программой пользуетесь для запуска скрипта? У меня в firebug'е и мозиле не выводится...

oneguy 05.07.2012 01:54

Цитата:

Сообщение от dump
alert('NaN'==NaN);

Если в операторе "==" операнды число и строка, то строка перед сравнением приводится в число. В данном случае 'NaN' приводится к NaN, а оно не равно самому себе. В справочнике ошибка, там написано, что "если какой-либо операнд строка - второй преобразуются в строку", хотя это неверно.
Цитата:

alert('undefined'==undefined);
alert('null'==null);
При нестрогом сравнении undefined считается равным null, но эти значения не равны никакому другому значению.
Цитата:

Сообщение от dump
А вы какой программой пользуетесь для запуска скрипта? У меня в firebug'е и мозиле не выводится...

У меня в Firebug'е при выполнении alert('dump'++); выводит прямо в консоль "SyntaxError: invalid increment operand".

Drimogemon 05.07.2012 13:48

ВНИМАНИЕ ПРАВИЛЬНЫЙ ОВТЕТ


Цитата:

Сообщение от 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 не найдина

bes 05.07.2012 15:59

Цитата:

Сообщение от Drimogemon
Сообщение от dump
alert('dump'++);
ошибка, строку нельзя увеличить на один

var str = '1'; 
alert(str);
str++;
alert(str + '; ' + typeof(str))
str += '';
alert(str + '; ' + typeof(str))

Drimogemon 05.07.2012 19:35

bes,
млять строку можно увеличить на один если она может преобразоваться к числу, не знаешь что ли как пост инкримент работает? очевидно же что имеется ввиду строка в значении "текст".

bes 05.07.2012 20:10

Цитата:

Сообщение от Drimogemon
ошибка, строку нельзя увеличить на один

Цитата:

Сообщение от Drimogemon
bes,
млять строку можно увеличить на один если она может преобразоваться к числу, не знаешь что ли как пост инкримент работает? очевидно же что имеется ввиду строка в значении "текст".

Здесь экстрасенсов мало, а очевидное иногда бывает далеко не очевидным, млякать вообще не стоит, здесь культурный форум (ну или я его себе таким представляю:) )


Часовой пояс GMT +3, время: 12:05.