Когда инициализировать переменные в JavaScript с null или вообще не инициализировать?

Я видел различные примеры кода с переменными, объявленными и установленными в undefined и null. Например:

var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'

если код для следования этим объявлениям присваивает значение a или b, какова причина использования одного типа объявления над другим?

5 ответов


первый пример ничего не присваивает переменной, поэтому он неявно ссылается на undefined значение (см. 10.5 в спец за подробностями). Он обычно используется при объявлении переменных для последующего использования. Нет необходимости явно назначать им что-либо до необходимости.

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

в сторону, что причуда null является хорошей причиной для использования более надежной формы проверки типа:

Object.prototype.toString.call(null); // Returns "[object Null]"

Я не думаю, что есть какой-то лучший способ сделать что-то, но я склонен избегать неопределенного, насколько это возможно. Возможно, это связано с сильным фоном ООП.

когда я пытаюсь имитировать ООП с помощью Javascript, я обычно объявляю и инициализирую явно мои переменные в null (как и языки ООП, когда вы объявляете переменную экземпляра без явной инициализации). Если я не собираюсь их инициализировать, зачем вообще их объявлять? При отладке, если вы не установили значение для переменной, которую вы смотрите, вы увидите ее как неопределенную, объявили ли вы ее или нет...

Я предпочитаю держать undefined для конкретного поведения:

  • когда вы вызываете метод, любой аргумент не будет иметь неопределенное значение. Хороший способ иметь необязательный аргумент, реализуя определенное поведение, если аргумент не определен.
  • ленивый init... в моей книге undefined означает " не инициализировано: go fetch the value", и null означает " инициализировано, но значение было null (например, может быть, была ошибка сервера?)"
  • массивы: myArray[myKey] = = = null если для этого ключа есть значение null, не определено, если для этого ключа никогда не было установлено значение.

будьте осторожны, что myVar == null и myVar == undefined возвращает то же значение, является ли myVar неопределенным, null или что-то еще. Использовать === Если вы хотите знать, если переменная неопределена.


Я только что увидел эту ссылку, которая прояснила мой вопрос. какая причина использовать null вместо undefined в JavaScript?

Javascript для веб-разработчиков заявляет "при определении переменной, которая предназначена для последующего хранения объекта, рекомендуется инициализировать переменную в null, а не что-либо еще. Таким образом, вы можете явно проверить значение null, чтобы определить, была ли переменная заполнена ссылкой на объект позже."


Я бы явно выбрал null, чтобы не иметь объекта, идентификатор которого позже был бы перезаписан в любом случае:

var foo = {}; // empty object, has id etc.
var foo2 = null; // good practice, // filled with an object reference at a later time
var foo3;// undefined, I would avoid it
console.log(typeof foo);
console.log(typeof foo2);
console.log(typeof foo3);

null также обеспечивает хорошую читаемость для определения типа данных (объект), результаты в

object
object
undefined

источник (профессиональный JavaScript для веб-разработчиков, 3-е издание):

при определении переменной, которая предназначена для последующего хранения объекта, это рекомендуется инициализировать переменную в null, а не что-либо еще. Таким образом, вы можете явно проверить значение null на определите, была ли переменная заполнена ссылкой на объект в более позднее время, например, в этом примере:

if (foo2 != null){
    //do something with foo2
}

значение undefined является производной от null, поэтому ECMA-262 определяет их как внешне равные следующим образом:

console.log(null == undefined); // prints true
console.log(null === undefined);// prints false

null является объектом.. Когда что-то не определено, это ничто.. это не объект, не строка, потому что она еще не определена.. очевидно.. тогда это просто свойство без функции..

пример:

вы объявляете переменную с var, но никогда не устанавливаете ее.

var foo; 
alert(foo); //undefined.

вы пытаетесь получить доступ к свойству объекта, который вы никогда не устанавливали.

var foo = {};
alert(foo.bar); //undefined

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

function myFunction (foo) {
  alert(foo); //undefined.
}