Основы JS (7): разница между Undefined и Null

JavaScript

1. Основные типы данных

Прежде чем представить undefined и null, давайте взглянем на типы данных в ECMAScript. В ECMAScript существует шесть простых типов данных (также известных как примитивные типы данных): Undefined, Null, Boolean, Number and String и Symbol (представленный в ES6). Также есть сложный тип данных — Object.

И Undefined, и Null имеют только одно значение, соответствующее undefined и null соответственно. Эти два разных типа значений имеют разную семантику и сценарии, но также демонстрируют относительно похожее поведение.

2. не определено

Буквальное значение undefined: неопределенное значение. Семантика этого значения заключается в том, что оно надеется представить наиболее примитивное состояние переменной, а не результат человеческих манипуляций. Это необработанное состояние возникает в следующих 4 сценариях:

1. Объявить переменную, но не присваивать значение

var foo;
console.log(foo); // undefined

Обращение к foo возвращает undefined, указывая на то, что переменная ни разу не использовалась с момента ее объявления и не было определено какое-либо допустимое значение.

2. Доступ к несуществующим свойствам или неопределенным переменным объекта

console.log(Object.foo); // undefined
console.log(typeof demo); // undefined

При доступе к свойству foo объекта Object возвращается undefined , что указывает на то, что свойство с именем foo не существует или не определено в объекте; выполнение оператора typeof для необъявленной переменной возвращает неопределенное значение.

3. Функция определяет формальные параметры, но не передает фактические параметры

//函数定义了形参 a
function fn(a) {
    console.log(a); // undefined
}
fn(); //未传递实参

Функция fn определяет формальный параметр a, но fn вызывается без параметров, поэтому параметр a при запуске fn является примитивной переменной без присвоения.

4. Используйте void для вычисления выражений

void 0 ; // undefined
void false; // undefined
void []; // undefined
void null; // undefined
void function fn(){} ; // undefined

В ECMAScript четко оговаривается, что оператор void возвращает неопределенное значение при оценке любого выражения, что аналогично функции, которая не возвращает значение после выполнения операции.Функции в JavaScript имеют возвращаемые значения.Если нет операции возврата, возвращается значение по умолчанию Исходное значение состояния, это значение не определено, что указывает на то, что возвращаемое значение функции не определено.

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

Три, ноль

Null буквально означает: пустое значение. Семантика этого значения заключается в том, что оно хочет представлять объект, который был искусственно сброшен в пустой объект, а не исходное состояние переменной. Представление в памяти состоит в том, что переменные в стеке не указывают на объекты памяти в куче.

1. Как правило, в следующих двух случаях мы присваиваем переменной значение null

  • Если переменная определена для хранения объекта в будущем, лучше инициализировать переменную нулем, а не каким-либо другим значением. Другими словами, пока переменная, предназначенная для хранения объекта, на самом деле не содержит объект, вы должны явно разрешить переменной хранить нулевое значение, что помогает еще больше различать нулевое и неопределенное значение.

  • Когда часть данных больше не нужна, лучше освободить ссылку на нее, установив для нее значение null, что называется разыменованием. Однако разыменование значения не означает, что память, занимаемая измененным значением, автоматически освобождается. Настоящим эффектом разыменования является получение значения из контекста выполнения, чтобы оно могло быть собрано сборщиком мусора при следующем запуске. Разыменование также помогает устранить возможные циклические ссылки. Это относится к большинству глобальных переменных и свойств глобальных объектов, локальные переменные автоматически разыменовываются, когда они покидают среду выполнения (когда функция завершает выполнение).

2. Специальный тип null

Когда мы используем оператор typeof для проверки нулевых значений, мы должны ожидать возврата «Null», но на самом деле возвращаемый тип — «object».

var data = null;
console.log(typeof data); // "object"

Это странно? На самом деле, мы можем понять этот результат с двух сторон:

  • С одной стороны, с логической точки зрения, нулевое значение представляет собой пустой указатель объекта, который на самом деле представляет собой пустой объект, поэтому вполне понятно возвращать «объект» при использовании оператора typeof для обнаружения.

  • С другой стороны, в исходной реализации JavaScript значение в JavaScript было представлено меткой, представляющей тип и фактическое значение данных (метка типа объекта была равна 0). Поскольку null представляет нулевой указатель (0x00 на большинстве платформ), метка типа null также становится равной 0, а typeof null неправильно возвращает "object". В ES6 было предложение, которое исторически было тривиальным, исправлять значение типа null на null, но окончательное предложение было отклонено, поэтому тип «объект» все еще сохранялся.

4. Резюме

Суммируя разницу между ними в одном предложении: undefined означает естественное и наиболее примитивное значение состояния переменной, а null означает, что переменная искусственно устанавливается в пустой объект вместо исходного состояния. Поэтому в процессе фактического использования, чтобы обеспечить семантику, представляемую переменной, не присваивайте переменной значение undefined явно.Когда вам нужно освободить объект, вы можете напрямую присвоить ему значение null.