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