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

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

Что такое null?

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

  • null показывает, что переменная пуста»;
  • 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 являются двумя из них. Полный перечень:

  • false
  • 0
  • ""
  • null
  • undefined
  • NaN — Not A Number

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

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

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • 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

Если все-таки что-то осталось не обсужденным, то приглашаю в комментарии. Буду рад ответить.