Каждый, кто начинает свою историю с JavaScript, наверное, обратил свое внимание на два литерала: null и undefined. На первый взгляд может показаться, что разницы между ними нет, но это совсем не так. Эта статья раскрывает их сходства и различия, а также показывает практическое применение.
Что такое 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
2 комментария
Добавить комментарий