Когда в JavaScript используется значение null или undefined?
Я действительно смущен, когда JavaScript возвращает null
или undefined
. Похоже, что разные браузеры возвращают их по-другому.
Не могли бы вы привести несколько примеров null
/undefined
браузерами, которые их возвращают.
В то время как я теперь ясно в аспекте undefined
, я все еще не уверен на 100% на null
. Это похоже на пустое значение?
например. У вас есть текстовое поле, которое не имеет никакого значения. Теперь, когда вы пытаетесь получить доступ к его значению, будет ли он null
или undefined
и похожи ли они?
Ответы
Ответ 1
Методы DOM getElementById()
, nextSibling()
, childNodes[n]
, parentNode()
и т.д. возвращают null
(определенные, но не имеющие значения), когда вызов не возвращает объект node.
Определено свойство , но объект, к которому он относится, не существует.
Это один из немногих случаев, когда вы можете не проверить на равенство -
if(x!==undefined)
будет истинным при нулевом значении
но if(x!= undefined)
будет истинным (только) для значений, которые не являются undefined
или null
.
Ответ 2
Я считаю, что некоторые из этих ответов расплывчаты и сложны, я считаю, что лучший способ понять эти вещи - это просто открыть консоль и протестировать ее самостоятельно.
var x;
x == null // true
x == undefined // true
x === null // false
x === undefined // true
var y = null;
y == null // true
y == undefined // true
y === null // true
y === undefined // false
typeof x // 'undefined'
typeof y // 'object'
var z = {abc: null};
z.abc == null // true
z.abc == undefined // true
z.abc === null // true
z.abc === undefined // false
z.xyz == null // true
z.xyz == undefined // true
z.xyz === null // false
z.xyz === undefined // true
null = 1; // throws error: invalid left hand assignment
undefined = 1; // works fine: this can cause some problems
Итак, это определенно один из самых тонких нюансов JavaScript. Как вы можете видеть, вы можете переопределить значение undefined
, делая его несколько ненадежным по сравнению с null
. Насколько я могу сказать, используя оператор ==
, вы можете с уверенностью использовать null
и undefined
. Однако из-за того, что null
нельзя переопределить, я мог бы использовать его при использовании ==
.
Например, variable != null
будет ВСЕГДА возвращать значение false, если variable
равно либо null
, либо undefined
, тогда как variable != undefined
вернет значение false, если variable
равно либо null
, либо undefined
UNLESS undefined
переназначается заранее.
Вы можете надежно использовать оператор ===
для разграничения между undefined
и null
, если вам нужно убедиться, что значение действительно undefined
(а не null
).
В соответствии со спецификацией ECMAScript 5:
- Оба
null
и undefined
являются двумя из шести встроенных типов.
4.3.9 undefined значение
примитивное значение, используемое, когда переменной не присвоено значение
4.3.11 null value
примитивное значение, которое представляет собой намеренное отсутствие какого-либо значения объекта
Ответ 3
Вы получаете undefined для различных сценариев:
Вы объявляете переменную с var, но никогда не устанавливаете ее.
var foo;
alert(foo); //undefined.
Вы пытаетесь получить доступ к свойству объекта, который вы никогда не устанавливали.
var foo = {};
alert(foo.bar); //undefined
Вы пытаетесь получить доступ к аргументу, который никогда не предоставлялся.
function myFunction (foo) {
alert(foo); //undefined.
}
Как отметили cwolves в комментарии к другому ответу, функции, которые не возвращают значение.
function myFunction () {
}
alert(myFunction());//undefined
Нуль обычно должен быть преднамеренно задан для переменной или свойства (см. комментарии к случаю, в котором он может появиться без установки). Кроме того, null имеет тип object
и undefined имеет тип undefined
.
Я также должен отметить, что в JSON действителен null, но undefined не является:
JSON.parse(undefined); //syntax error
JSON.parse(null); //null
Ответ 4
Мне может быть что-то не хватает, но afaik, вы получаете undefined
только
Обновление: Хорошо, я пропустил много, пытаясь завершить:
Вы получаете undefined
...
... при попытке доступа к свойствам объекта, который не существует:
var a = {}
a.foo // undefined
... когда вы объявили переменную, но не инициализировали ее:
var a;
// a is undefined
... при доступе к параметру, для которого не было передано никакого значения:
function foo (a, b) {
// something
}
foo(42); // b inside foo is undefined
... когда функция не возвращает значение:
function foo() {};
var a = foo(); // a is undefined
Возможно, некоторые встроенные функции возвращают null
для некоторой ошибки, но если это так, то это задокументировано. null
является конкретным значением в JavaScript, undefined
не является.
Обычно вам не нужно различать их. В зависимости от возможных значений переменной достаточно использовать if(variable)
для проверки того, установлено ли значение или нет (оба, null
и undefined
оцениваются до false
).
Также разные браузеры, похоже, возвращают их по-другому.
Просьба привести конкретный пример.
Ответ 5
В отношении этой темы спецификация (ecma-262) достаточно ясна.
Я нашел это действительно полезным и понятным, чтобы поделиться им:
- Здесь вы найдете алгоритм равенства
- Здесь вы найдете Строгий алгоритм равенства
Я натолкнулся на него, читая "Абстрактное равенство, строгое равенство и то же значение" с сайта разработчика mozilla, однотипность раздела.
Надеюсь, вы сочтете это полезным.
Ответ 6
Свойство, если оно не имеет определения, undefined.
null - объект. Он имеет значение null. undefined не является объектом, его тип undefined.
Это хорошая статья, объясняющая разницу, а также некоторые примеры.
null vs undefined