Когда в 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