Когда я инициализирую переменные в 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, в чем причина использования одного типа объявления над другим?
Ответы
Ответ 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.
}