Подтвердить что ты не робот

Когда я инициализирую переменные в JavaScript с нулевым или вообще не?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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 на определить, была ли переменная заполнена ссылкой на объект в позднее, например, в этом примере:

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

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

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

Ответ 5

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

Пример:

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

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

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

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

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

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