Каждый, кто начинает свое приключение с 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 являются двумя из них. Полный перечень:
false0""nullundefinedNaN— 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
Если все-таки что-то осталось не обсужденным, то приглашаю в комментарии. Буду рад ответить.