В чем практические отличия null от undefined?

Всем привет

Задался вопросом, какая практическая разница между null и undefined, без отсылки как они работают, а именно что они значат?

Пока не могу найти практического кейса, где null нельзя заменить undefined без потери смысла.

В теории null = пусто (нет данных), undefined = переменная определена, но данных не определены (т.е. тоже самое что null, по идее), но как это наложить на практику в JS, не понятно.

Подскажите, кто сталкивался.
  • Вопрос задан
  • 5782 просмотра
Пригласить эксперта
Ответы на вопрос 10
kondrackii
@kondrackii
1 + 1 = 11
Если вкратце, то:
null - ожидаемая пустота
undefined - неожиданная пустота
Ответ написан
Комментировать
@dmitry-toster
Автор, вы загоняетесь
null - присваивает программист
undefined- присваивается самим JS
Программист может создать переменную со значением undefined, но по правилам хорошего тона - делать так не надо. Переменная, которую создал человек, должна выглядеть так:
let a;
либо так:
let a = null;

Вот и все, что вам нужно знать!
Ответ написан
Комментировать
longclaps
@longclaps
как это наложить на практику в JS, не понятно

Так и не накладывай.
Большинство языков обходятся значением null/nul/nil/None для неинициализированного значения. Создатель JS выпендрился, он придумал неинициализированное и разинициализированное значения.
Ответ написан
Комментировать
var a;
while (typeof a == 'undefined') {
    if (... какое-то изменяемое условие...) {
        a = ...null или любое другое значение...; //после этого цикл прервётся
    }
}
Ответ написан
yakimchuk-ry
@yakimchuk-ry Автор вопроса
Нашел вот это, это более-менее вносит ясность:

Setting a variable to null initially indicates your intent for that variable; it should even-
tually contain an object.
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
undefined - имеет отдельный тип данных, при том это юнит-тип (имеет единственное значение). Кроме того, это значение по умолчанию для неинициализированных переменных, непереданных аргументов, результата функции, которая ничего не вернула и отсутствующих полей объектов (включая цепочку прототипов), а так же this по умолчанию (с es5). У undefined нет своего литерала, но есть неизменяемая (с es5) глобальная переменная. Кроме того undefined можно получить из оператора void. Забавно, что в v8 это единственный не ссылочный тип данных, а в памяти хранится только тэг типа.
null - по спеке тоже должен иметь свой юнит-тип, но абсолютно во всех реализациях он имеет тип object. В отличие от undefined, null - это ссылка, а значит в памяти будет тэг типа + указатель. В v8 этот указатель ведет на static память, поэтому любой null всегда равен любому другому null, даже из другого контекста, что соответствует спеке.
Ответ написан
@MalGym
Я для себя нашел одно применение . undefined - значит , что значение не задано , нет его и тд , а null , просто пустота ( все это грубо говоря ) и если нам надо делать проверку , задано ли значение переменной например :
let a = null; 
console.log(a);

Мы получим null , следовательно переменная у нас есть со значение null , а если мы напишем так:
let a = undefined; 
console.log(a);


Мы получим undefined . И тут вот не понятно , то ли у переменной "а" значение ровно undefined , то ли такая переменная вообще не существует. То же самое касамое и свойств в объектах и тд. При отладке не понятно , мы имеем значение равное undefined или такой перменной/свойтсва не существует. Чтобы избежать таких "недопониманий" при отладке и лучше/корнектнее отлавливать ошибки , присваивайте пустым значениям null . Как-то так , мой опыт и мое понимание, если где ошибаюсь , пусть поправят )
Ответ написан
Комментировать
profesor08
@profesor08 Куратор тега JavaScript
В теории null = пусто (нет данных), undefined = переменная определена, но данных не определены (т.е. тоже самое что null, по идее), но как это наложить на практику в JS, не понятно.

Нет.
null это значение переменной, обозначающее что-то там, не важно что, но с этим можно что-то сделать или проверить.

undefiend обозначает лишь то, что переменная/свойство не определена, это так и переводится, загляни в словарь, если не веришь.

// пример использования null
let data = null;

button.click(loadData(result => {
  data = result .data;
}));

// еще пример с null
function getSmth(type = null) {
  if (type === null) { // если null, то вернуть все
    return data.types;
  }

  // если не null, то фильтруем по значению
  return data.types.filter(t => t.type === type)
}


// пример с undefined
const data = {
  type: 8,
  index: 15,
};

console.log(data.type); // 8
console.log(data.option); // undefined, потому что не объявлено, попробуй получить тут null без проверок...


Вопросов не должно остаться.
Ответ написан
Комментировать
@DLeo13
Я выделяю 2 момента (исключая частности JS с равенством), возможно это будет полезно для вас.

Первый. После декларации чего либо при не указанном значении, что либо будет неопределенно, соответственно undefined.

Второе. Null - обнуление. Если что-то важно очистить или присвоить логический ноль, то следует присваивать именно это.

Если соблюдать эти правила, то подводных камней не будет. В частности встречал случай с Object.assign. Если нужно спроицировать объект на условно нулевую (чистую) модель, у модели не должно быть undefined, иначе свойство присвоено не будет (должно быть null).
Ответ написан
Комментировать
@NovaVovikov
- null - это пустое или несуществующее значение
- null должен быть присвоен
- undefined чаще всего означает, что переменная была объявлена, но не определена
- при поиске несуществующих ключей в объекте мы также получим undefined
- при использовании typeof для проверки null он возвращает объект, undefined же возвращает undefined
- в функции с параметрами по умолчанию undefined будет использовать значение по умолчанию, а null - нет
- JSON может обрабатывать только null, но не undefined

Взял вот отсюда. Там расписано подробнее и с примерами, если интересно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы