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,
млять строку можно увеличить на один если она может преобразоваться к числу, не знаешь что ли как пост инкримент работает? очевидно же что имеется ввиду строка в значении "текст".

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

Drimogemon 05.07.2012 20:19

Цитата:

Сообщение от bes
ну или я его себе таким представляю

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

Drimogemon 05.07.2012 20:31

Цитата:

Сообщение от Дзен-трансгуманист
Ловлю на слове.

раз ловишь то вот)

alert( +'1'     +1 )

Drimogemon 05.07.2012 21:04

Цитата:

Сообщение от Дзен-трансгуманист
Речь была о пост инкрименте. "Очевидно же".

Речь шла о инкрименте а слово было о строке)


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