我看过不同的代码示例,其中变量被声明并设置为undefined和null。例如:
var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'
如果代码为这些声明中的一个赋值给a或b,那么使用一种类型的声明而不是另一种类型的声明的原因是什么?
我看过不同的代码示例,其中变量被声明并设置为undefined和null。例如:
var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'
如果代码为这些声明中的一个赋值给a或b,那么使用一种类型的声明而不是另一种类型的声明的原因是什么?
第一个例子没有将任何东西分配给变量,因此它隐式地引用了undefined
值(有关详细信息,请参见规范10.5章)。通常在声明变量以供以后使用时使用它们。在必要之前,不需要明确地分配任何内容。
第二个例子显式分配了null
(实际上是null
类型,但由于JavaScript规范的怪癖,声称具有“对象”类型)。通常用于清除已存储在现有变量中的值。在清除值时使用null
可能更为健壮,因为可以覆盖undefined
,在这种情况下,分配undefined
将导致意外行为。
顺便说一句,null
的这种怪癖是使用更健壮的类型检查形式的好理由:
Object.prototype.toString.call(null); // Returns "[object Null]"
我不认为有特别好的做事方式,但我倾向于尽可能避免使用未定义。也许这是因为我有强烈的面向对象编程背景。
当我尝试用Javascript来模拟OOP时,通常会明确地声明和初始化我的变量为空值(就像在声明实例变量但未显式初始化时所做的那样)。 如果我不打算对它们进行初始化,为什么一开始要声明它们呢?在调试时,如果您没有为您监视的变量设置一个值,无论您是否声明过它,您都将看到它的值为undefined...
我更喜欢将undefined
保留给特定的行为:
但要小心,myVar == null
和myVar == undefined
返回相同的值,无论myVar是未定义、null还是其他东西。如果要知道一个变量是否未定义,请使用===
。
null
本身(因为它是一个“对象”),没有任何东西===
(三个等号)null
。 - JR Halchakvar 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
来源(《Web开发者专业JavaScript第三版》):
当定义一个变量,它最终将持有一个对象时,建议将变量初始化为null,而不是其他任何值。这样,您可以明确地检查null值,以确定变量是否在稍后的时间被填充了对象引用,例如在以下示例中:
if (foo2 != null){
//do something with foo2
}
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.
}
toString()
的"[object Null]"
结果可能存在一些浏览器不兼容性。 - I Hate Lazy