В чем разница между нулевым и неопределенным в JavaScript? - PullRequest
966 голосов
/ 22 февраля 2011

Я хочу знать, в чем разница между null и undefined в JavaScript.

Ответы [ 28 ]

6 голосов
/ 22 февраля 2011

null - это специальное значение, означающее «нет значения».null является специальным объектом, потому что typeof null возвращает 'объект'.

С другой стороны, undefined означает, что переменная не была объявлена ​​или ей не было присвоено значение.

4 голосов
/ 21 сентября 2018

Лучший способ понять разницу - это сначала очистить свой разум от внутренней работы JavaScript и просто понять разницу в значении между:

let supervisor = "None"
    // I have a supervisor named "None"

let supervisor = null
    // I do NOT have a supervisor. It is a FACT that I do not.

let supervisor = undefined
    // I may or may not have a supervisor. I either don't know
    // if I do or not, or I am choosing not to tell you. It is
    // irrelevant or none of your business.

Существует разница в значении между этими тремя случаямии JavaScript различает два последних случая с двумя разными значениями null и undefined.Вы можете использовать эти значения явно для передачи этих значений.

Итак, каковы некоторые специфичные для JavaScript проблемы, возникающие из-за этой философской основы?

  1. Aобъявленная переменная без инициализатора получает значение undefined, потому что вы никогда ничего не говорили о том, каким было предполагаемое значение.

    let supervisor;
    assert(supervisor === undefined);
    
  2. Свойство объекта, который никогда не был установлен, оцениваетна undefined, потому что никто никогда не говорил ничего об этом свойстве.

    const dog = { name: 'Sparky', age: 2 };
    assert(dog.breed === undefined);
    
  3. null и undefined "похожи" друг на друга, потому что Брендан Айх так сказал.Но они абсолютно не равны друг другу.

    assert(null == undefined);
    assert(null !== undefined);
    
  4. null и undefined, к счастью, имеют разные типы.null относится к типу Null и undefined к типу Undefined.Это в спецификации, но вы никогда не узнаете об этом из-за странности typeof, которую я не буду здесь повторять.

  5. Функция, достигающая конца своего тела без явного возвратаоператор возвращает undefined, так как вы ничего не знаете о том, что он возвратил.

Кстати, в JavaScript есть и другие формы "небытия" (хорошо изучать философию....)

  • NaN
  • Использование переменной, которая никогда не была объявлена, и получение ReferenceError
  • Использование let или const определил локальную переменную в своей временной мертвой зоне и получил ReferenceError
  • пустых ячеек в разреженных массивах.Да, это даже не undefined, хотя они сравнивают === с неопределенным.

    $ node
    > const a = [1, undefined, 2]
    > const b = [1, , 2]
    > a
    [ 1, undefined, 2 ]
    > b
    [ 1, <1 empty item>, 2 ]
    
4 голосов
/ 18 февраля 2014

В JavasSript есть 5 примитивных типов данных String, Number, Boolean, null и undefined.Я попытаюсь объяснить на некотором простом примере

, скажем, у нас есть простая функция

 function test(a) {

     if(a == null){
        alert("a is null");
     } else {
        alert("The value of a is " + a);
     }
  }

также в вышеприведенной функции, если (a == null) такой же, как если бы (! A)

теперь, когда мы вызываем эту функцию без передачи параметра a

   test(); it will alert "a is null";
   test(4); it will alert "The value of a is " + 4;

также

var a;
alert(typeof a); 

, это даст неопределенное значение;мы объявили переменную, но мы не присваивали ей значения;но если мы напишем

var a = null;
alert(typeof a); will give alert as object

, то null это объект.таким образом, мы присвоили нулевое значение 'a'

3 голосов
/ 08 октября 2013

null и undefined оба используются для представления отсутствия некоторого значения.

var a = null;

a инициализируется и определяется.

typeof(a)
//object

null - это объект в JavaScript

Object.prototype.toString.call(a) // [object Object]

var b;

b не определено и не инициализировано

неопределенные свойства объекта также не определены.Например, «x» не определен для объекта c, и если вы попытаетесь получить доступ к cx, он вернет undefined.

Как правило, мы присваиваем переменным, не определенным, значение null.

3 голосов
/ 24 июня 2015

И ноль, и неопределенный в JavaScript указывают на отсутствие значения.

var a = null; //variable assigned null value
var b;  // undefined

Несмотря на то, что оба существуют из-за отсутствия значения, но: Undefined фактически означает, что переменная не инициализирована. Функции, которые возвращают ничего и функциональные параметры, для которых не указано значение, возвращается неопределенное значение. Используйте оператор строгого равенства === для различать ноль и неопределенность.

Ссылка: http://www.thesstech.com/javascript/null-and-undefined

3 голосов
/ 07 октября 2017

Когда вы объявляете переменную в javascript, ей присваивается значение undefined. Это означает, что переменная не тронута и ей может быть присвоено любое значение в будущем. Это также подразумевает, что вы не знаете значение, которое эта переменная будет содержать во время объявления.

Теперь вы можете явно назначить переменную null. Это означает, что переменная не имеет никакого значения. Например - Некоторые люди не имеют отчества. Поэтому в таком случае лучше присвоить значение null переменной middlename объекта person.

Теперь предположим, что кто-то обращается к переменной middlename вашего объекта person и имеет значение undefined. Он не знал бы, забыл ли разработчик инициализировать эту переменную или она не имеет никакого значения. Если оно имеет значение null, то пользователь может легко сделать вывод, что middlename не имеет никакого значения и не является нетронутой переменной.

3 голосов
/ 25 декабря 2015

Для типа undefined существует одно и только одно значение: undefined.

Для типа null существует одно и только одно значение: null.

Так что для обоих из них метка - это и ее тип, и ее значение.

Разница между ними.Например:

  • null - пустое значение
  • undefined - отсутствующее значение

Или:

  • undefined еще не имеет значения
  • null имеет значение и больше не

На самом деле null является специальным ключевым словом , а не идентификатор, и поэтому вы не можете рассматривать его как переменную для присвоения.

Однако undefined - это идентификатор .Однако как в режиме non-strict, так и в режиме strict вы можете создать локальную переменную с именем undefined.Но это одна ужасная идея!

function foo() {
    undefined = 2; // bad idea!
}

foo();

function foo() {
    "use strict";
    undefined = 2; // TypeError!
}

foo();
3 голосов
/ 06 июня 2017

ОК, мы можем запутаться, когда услышим о null и undefined, но давайте начнем с простого: они оба ложные и во многом похожи, но странная часть JavaScript,у них есть пара существенных различий, например, typeof null составляет 'object', в то время как typeof undefined равно 'undefined'.

typeof null; //"object"
typeof undefined; //"undefined";

Ноесли вы проверите их с помощью ==, как показано ниже, вы увидите, что они оба falsy :

null==undefined; //true

Также вы можете назначить null свойству объекта или примитиву, в то время какundefined можно просто достичь, ничего не назначая.

Я создаю быстрое изображение, чтобы сразу увидеть различия для вас.

Null and Undefined

2 голосов
/ 06 августа 2012

Поскольку typeof возвращает неопределенное значение, неопределенное является типом, где нулевое значение является инициализатором и указывает, что переменная указывает на отсутствие объекта (практически все в Javascript является объектом).

2 голосов
/ 14 января 2017

В javascript все переменные хранятся в виде пар ключ-значение. Каждая переменная хранится как имя_ переменной: переменная_значение / ссылка .

undefined означает, что переменной в памяти дан пробел, но ей не присвоено значение. Рекомендуется не использовать этот тип в качестве задания.

В таком случае, как обозначить, когда вы хотите, чтобы переменная была без значения на более позднем этапе кода? Вы можете использовать тип null , который также является типом, который используется для определения того же самого значения, отсутствия значения, но это не то же самое, что и undefined, так как в этом случае у вас фактически есть значение в памяти. Это значение равно null

Оба схожи, но использование и смысл разные.

...