在JavaScript中,何时使用null或不初始化变量?

46

我看过不同的代码示例,其中变量被声明并设置为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个回答

35

第一个例子没有将任何东西分配给变量,因此它隐式地引用了undefined值(有关详细信息,请参见规范10.5章)。通常在声明变量以供以后使用时使用它们。在必要之前,不需要明确地分配任何内容。

第二个例子显式分配了null(实际上是null类型,但由于JavaScript规范的怪癖,声称具有“对象”类型)。通常用于清除已存储在现有变量中的值。在清除值时使用null可能更为健壮,因为可以覆盖undefined,在这种情况下,分配undefined将导致意外行为。

顺便说一句,null的这种怪癖是使用更健壮的类型检查形式的好理由:

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

只是一点提醒...我认为toString()"[object Null]"结果可能存在一些浏览器不兼容性。 - I Hate Lazy

14
我刚看到这个链接,解决了我的问题。 在JavaScript中使用null而不是undefined的原因是什么? 《Web开发人员的Javascript》指出:“当定义一个变量以后用于保存对象时,建议将变量初始化为null而不是其他任何值。 这样,您可以显式地检查值null以确定变量是否在稍后的时间被填充了一个对象引用。”

11

我不认为有特别好的做事方式,但我倾向于尽可能避免使用未定义。也许这是因为我有强烈的面向对象编程背景。

当我尝试用Javascript来模拟OOP时,通常会明确地声明和初始化我的变量为空值(就像在声明实例变量但未显式初始化时所做的那样)。 如果我不打算对它们进行初始化,为什么一开始要声明它们呢?在调试时,如果您没有为您监视的变量设置一个值,无论您是否声明过它,您都将看到它的值为undefined...

我更喜欢将undefined保留给特定的行为:

  • 当您调用方法时,您没有提供的任何参数都将具有undefined值。如果参数未定义,则实现特定行为的一种好方式是将其作为可选参数。
  • 懒惰地初始化...在我的书中,未定义意味着“未初始化:去获取值”,而null则表示“已初始化但值为null(例如,可能发生了服务器错误)”
  • 数组:如果此键具有空值,则myArray [myKey] === null,如果从未为此键设置过值,则为undefined。

但要小心,myVar == nullmyVar == undefined返回相同的值,无论myVar是未定义、null还是其他东西。如果要知道一个变量是否未定义,请使用===


在最后一行需要注意的是,除了null本身(因为它是一个“对象”),没有任何东西===(三个等号)null - JR Halchak
如果我不打算初始化它们,为什么一开始还要声明它们呢?因为你想要使用if...else语句来设置值,但需要变量的作用域在if...else之外。尽管在JavaScript中,var具有函数作用域,所以在这种情况下并不适用。 - Yay295

9
我会明确地选择null,以避免创建一个id后来被覆盖的对象:
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

来源(《Web开发者专业JavaScript第三版》):

当定义一个变量,它最终将持有一个对象时,建议将变量初始化为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

也许你可以编辑回答并添加一些参考链接和论据。仅仅在这里提出“良好的实践”不过是一个观点而已。 - Álvaro González
1
我添加了参考书,它只是一本书,而不是标准。 - droid192

0

null是一个对象。当某个东西未定义时,它就是什么都不是,既不是对象也不是字符串,因为它还没有被定义。显然,它只是一个没有功能的属性。

例如:

你用var声明了一个变量,但从未设置它的值。

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

您试图访问一个您从未设置过的对象属性。

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

您试图访问一个从未提供的参数。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接