Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чем отличается undefined от null (https://javascript.ru/forum/misc/14132-chem-otlichaetsya-undefined-ot-null.html)

hrundel 31.12.2010 19:25

Чем отличается undefined от null
 
В чём отличие undefined от null?
Например такой код:
alert(document.getElementById('ooo2'));
при обращении к несуществующему элементу на html-странице выдаст "null".

А такой код:
var arr=new Array(3);
alert(arr[0]);
при обращении к несуществующему элементу массива выдаст "undefined".

Или ещё пример, когда переменной можно прям назначить значение, что она неопределена
var dd=undefined;
alert(dd);
Выдаст "undefined".

Чем различаются null и undefined? В каких случаях мы должны ожидать null, а в каких undefined?

B@rmaley.e><e 31.12.2010 19:31

null означает "ничего".
undefined означает, что значение не определено.

dmitriymar 31.12.2010 21:06

Цитата:

Сообщение от hrundel
var arr=new Array(3);
alert(arr[0]);
при обращении к несуществующему элементу массива выдаст "undefined".

почему не существующему? ты место под массив выделил и массив инициализировал
var arr=new Array(3);
var dd=undefined;
alert(dd);
Выдаст "undefined".
а здесь вопрос сложный-не думал что ты присваиваешь в этом случае значение а не присваиваешь тип?
ты присваиваеш дд значение переменной ундефенет-какая при этом у тебя не определена и в этом случае она становится глобальной переменной с неопределённым значением.

hrundel 31.12.2010 21:14

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 85909)
null означает "ничего".
undefined означает, что значение не определено.

Немного смущает, что при обращении к несуществующему элементу на странице мы получаем null, хотя логичнее undefined (???).

exec 31.12.2010 21:34

hrundel,
null это когда такое значение могло бы быть, но его нету
undefined это когда такого значения и быть не должно

window.kslsfkl; // Нет
window.onmouseover; // null


Можно и так объяснить.

SV0L0CH 31.12.2010 22:17

Дополнительная информация:
alert([typeof null,typeof undefined]);​

dmitriymar 31.12.2010 22:57

Цитата:

Сообщение от SV0L0CH
alert([typeof null,typeof undefined])

интересно... определяется тип типа....где логика в этом?

dmitriymar 31.12.2010 23:04

SV0L0CH,
что на это скажешь?

var undefined=7;
alert([typeof null,typeof undefined]);


ну значение null не буду пытаться изменить поскольку он идёт как зарезервированное слово также как и любой из операторов.
бормалей прав

Sweet 31.12.2010 23:21

Цитата:

Сообщение от dmitriymar
почему не существующему? ты место под массив выделил и массив инициализировал

hrundel прав - это именно обращение к несуществующему элементу. А вот выделение места под массив - это что-то не из js. Для размышления:
var a1 = [], a2 = new Array(3);
a1.length = 3;
alert(a1.toString() === a2.toString());
Или length тоже выделяет что-то?:)
И, кста, присвоение переменной типа - это, типа, что-то новенькое:)

dmitriymar 01.01.2011 00:09

Sweet,
ты хоть понял что ты написал? известно имя известна длинна-и не существует?я не вижу отличия в том что ты объявил сразу массив опр длинны или потом ему длину объявил. именно тот вариант когда от перемены мест слагаемых ничего не меняется

B@rmaley.e><e прав
это обращение к сущ элементу ну тип значения которого не определён. проведу аналогию -представь себе пустой контейнер ж.д. -ты знаешь его тип цвет инвентарный номер и т.д.-это условно имя какое определено. но пока ты не положиш в него какойто тип груза-он не станет контейнером для перевозки какого то вида груза.тоесть контейнер для перевозки неизвестно чего-контейнер.ундефенет.
ну а если его нет-то его нет вообще-ноль

Sweet 01.01.2011 01:32

Цитата:

Сообщение от dmitriymar
известно имя известна длинна-и не существует?

Речь идет о элементе массива, а не о самом массиве.

dmitriymar 01.01.2011 09:44

элемент уже предопределён что он есть.поскольку длинна массива заданна чётко.поскольку массив это объект и элементы его разнотипные-из этого всё и выходит.обратись к элементы какой выходит за приделы заданного числа и он начнёт существовать, точно также как и переменная какая не существовала начинает существовать и становится при её упоминании ундефинит. (отличие объявления переменной с var и без него)
а вот с деревом дум так не пройдёт поскольку механизм добавления гораздо сложнее и элемент не начнёт существовать только от того что его упомянули

Kolyaj 01.01.2011 12:39

В JavaScript нет массивов в том понимании, в котором они существуют в других языках. Особенно а-ля С/С++. Ничто под возможные элементы не выделяется. Создание new Array(3) означает лишь создание массива без элементов, свойство length которого равно 3. А свойство length в общем случае вообще не отражает количество элементов в массиве.
http://alljs.ru/articles/array/whatis.html

Sweet 01.01.2011 13:23

dmitriymar,
рекомендую пересмотреть стандарт ECMA, потому что из последнего сообщения видно, что в основном твои "знания" строятся на фантазиях и собственных выводов. Например:
Цитата:

Сообщение от dmitriymar
отличие объявления переменной с var и без него

Без var - это уже не объявление переменной. Все ровно что сказать, что массив можно объявить при помощи new Object(), только у него не будет некоторых методов, зато toString - останется. Но работать он будет как-то по другому. Короче, бредить - легко! Гораздо легче, чем прочитать и осознать стандарты.

dmitriymar 01.01.2011 15:47

Цитата:

Сообщение от Sweet
dmitriymar,
рекомендую пересмотреть стандарт ECMA, потому что из последнего сообщения видно, что в основном твои "знания" строятся на фантазиях и собственных выводов. Например:
Сообщение от dmitriymar
отличие объявления переменной с var и без него

ну чтож если по поводу фантазий-в этом случае сам восползуйся своим советом и пересмотри документацию
кто говорит за выделение места в массиве? разговор идёт о том что массив после этого начинает существовать.что в нём не важно-важно что он есть-и это идёт в разрез с утвержением ундефинит это когда нет

dmitriymar 01.01.2011 15:48

Цитата:

Сообщение от Sweet
Без var - это уже не объявление переменной.

да нет, без вар это объявление переменной с глобальной видимостью в любом участке кода

monolithed 01.01.2011 16:42

Цитата:

Сообщение от dmitriymar
да нет, без вар это объявление глобальной переменной в любом участке кода

ключевое слово var позволяет объявить переменную в текущей области видимости, без него - свойство глобального объекта window

dmitriymar 01.01.2011 16:46

monolithed,
каж понял что ты говоришь.свойство в этом случае будет выступать как хранилище переменной глоб?(это если утрированно)
просто,везде где встречал,утверждалось что именно глоб переменная создаётся. а создаётся глоб переменная как свойство окна или глоб переменная не проверял-главное что действует как глоб переменная

monolithed 01.01.2011 17:28

что-то типа такого))

hrundel 01.01.2011 19:32

Я думаю, что здесь отталкиваться надо от того, что getElementById() это встроенная функция, а не переменная, поэтому она возвращает такие значения. Но когда мы имеем дело с переменными, то там надо ожидать undefined всегда, когда переменная не определена. Вроде так получается.

Вот ссылки про эту функцию:
http://www.w3.org/TR/DOM-Level-2-Cor...ml#ID-getElBId
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Есть ещё NaN, кстати.

monolithed 01.01.2011 21:23

Цитата:

Сообщение от hrundel
о когда мы имеем дело с переменными, то там надо ожидать undefined всегда

Если не инициализированна!
i = false; //переменная не определена, но инициализированна
alert(i); //false

var i; //переменная определена, но не инициализированна
alert(i); //undefined

var i = true; //переменная определена и инициализированна
alert(i); //true

Цитата:

Сообщение от hrundel
Есть ещё NaN, кстати.

К чему это вообще?

Gozar 01.01.2011 22:06

удалено.


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