JavaScript - разница между null и undefined

  • 10 марта, 09:08
  • 21841
  • 2

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

Что такое null?

null имеет две особенности, которые надо себе подчеркнуть:

  1. null показывает, что переменная «пустая»;
  2. null должен быть присвоен.

Например, мы присваиваем значение null переменной a:

let a = null;
console.log(a);  // null


Что такое undefined?

undefined обычно означает, что переменная объявлена, но не имеет присвоенного значения. Например:

var a;
console.log(a); // undefined
console.log(b); // undefined
var b;

Мы можем задекларировать переменную b таким образом благодаря «Поднятию». Именно для реализации этого был использован оператор var.

Или при поиске несуществующих свойств объекта вы получите undefined:

let a = {};
console.log(a.fake);  // undefined

Подобные вещи между null и undefined

В JavaScript существует всего шесть ложных значений ( Falsy ). null и undefined являются двумя из них. Полный перечень:

  1. false
  2. 0
  3. " "
  4. null
  5. undefined
  6. NaN - Not A Number

Все другие значения правдивы. То есть объект Boolean вернет true.

Также в JavaScript есть шесть простых типов . Опять-таки, null и undefined являются двумя из них. Полный перечень:

  1. Boolean
  2. Null
  3. Undefined
  4. Number
  5. String
  6. Symbol

Все остальное является объектом: функция, объект, список и тому подобное. То есть метод Object.isObject(x) был бы просто !Object.isPrimitive(x).

Довольно интересно, что typeof от null возвращает тип object. Хотя он не экземпляр Object.

let a = null;
let b;

console.log(typeof a); // object
console.log(typeof b); // undefined

console.log(null instanceof Object) // false

Так сложилось в силу исторических причин. Это было багом и Брэндон Айк сам это признает .

Стоит также заметить, что сравнение true и false с null и undefined возвращают false:

null == true;  // false
null == false; // false
null === true; // false
null === false; // false

undefined == true; // false
undefined == false; // false
undefined === true; // false
undefined === false; // false

Разница: null !== undefined

Исследовав общие и отличительные черты, можно с уверенностью сказать, что то, что null строго не равна undefined имеет смысл. null !== undefined // true

Но строгое сравнение null != undefined // false возвращает false, так как два значения перед сравнением конвертируются к одному и тому же типу. Несмотря на то, что в это же время конвертация !!null и !!undefined возвращает false.

В арифметических операциях null конвертируется в 0, а undefined возвращает NaN:

null + 1  // 1
null / 10 // 0
null * 10 // 0

undefined + 1 // NaN
undefined / 10 // NaN
undefined * 10  // NaN

Потому как null в арифметических операциях конвертируется в 0, то функция isFinite возвращает true для null, в отличие от undefined.

isFinite(undefined);  // false
isFinite(null);  // true

Практическое применение приобретенных знаний

Благодаря тому, что null не настоящий объект (это единственный не истинный объект. Пустые объекты правдивые), то мы имеем возможность написать функцию isNull:

const isNull = (val) => !val && typeof val === 'object';

isNull(null);  // true

А так выглядела функция isUndefined:

const isUndefined = (value) => typeof value === 'undefined';

isUndefined(undefined);  // true


Теги: код javascript
2 комментария
Сортировка:
Добавить комментарий
belocerkovecden@gmail.com
belocerkovecden@gmail.com 2020, 25 сентября, 09:02
0

Здравствуйте.
Очень классная статья, спасибо Вам большое.
Поправьте пожалуйста первую строку, -
"литералы:" !== "литерала"


IT Новости

Смотреть все