我何时使用null初始化JavaScript中的变量?

KMc*_*McA 36 javascript variables null undefined

我已经看到了声明变量并设置为undefined和null的不同代码示例.如:

var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'
Run Code Online (Sandbox Code Playgroud)

如果遵循这些声明的代码为a或b赋值,那么使用一种声明而不是另一种声明的原因是什么?

Jam*_*ice 29

第一个示例没有为变量赋值,因此它隐式引用该undefined值(详见规范中的10.5).它通常在声明变量供以后使用时使用.在必要之前,无需向其明确指定任何内容.

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

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

Object.prototype.toString.call(null); // Returns "[object Null]"
Run Code Online (Sandbox Code Playgroud)


KMc*_*McA 10

我刚刚看到这个链接澄清了我的问题. 什么原因在JavaScript中使用null而不是undefined?

用于Web开发人员的Javascript声明"在定义稍后要保存对象的变量时,建议将变量初始化为null而不是其他任何东西.这样,您可以显式检查值null以确定变量是否已经在以后填充了一个对象引用."

  • +1这听起来像是一个很好的做法 (4认同)

Evr*_*glu 10

我不认为有更好的做事方式,但我倾向于尽可能避免未定义.也许这是由于强大的OOP背景.

当我尝试使用Javascript模仿OOP时,我通常会将我的变量声明并初始化为null(当您声明实例变量而不显式初始化它时,OOP语言也是如此).如果我不打算初始化它们,为什么甚至首先声明它们?当你调试时,如果你没有为你看的变量设置一个值,你会看到它是未定义的,无论你是否声明它...

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

  • 当您调用方法时,您未提供的任何参数都将具有未定义的值.拥有可选参数的好方法,如果未定义参数,则实现特定行为.
  • lazy init ...在我的书中undefined意味着"未初始化:go获取值",null表示"已初始化但值为null(例如,可能存在服务器错误?)"
  • arrays:myArray [myKey] === null如果此键有空值,如果从未为此键设置了值,则为undefined.

不过要小心,那myVar == nullmyVar == undefinedmyVar的是未定义,为null或别的东西返回相同的值.使用===,如果你想知道一个变量是不确定的.


qrt*_*tLs 6

我将明确选择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);
Run Code Online (Sandbox Code Playgroud)

设置null还可以确保良好的可读性,以识别数据类型(对象),从而

object
object
undefined
Run Code Online (Sandbox Code Playgroud)

来源(针对Web开发人员的专业JavaScript第三版):

当定义一个打算稍后用于保存对象的变量时,建议将变量初始化为null,而不是其他任何东西。这样,您可以显式检查值null,以确定该变量以后是否已用对象引用填充,例如以下示例:

if (foo2 != null){
    //do something with foo2
}
Run Code Online (Sandbox Code Playgroud)

值undefined是null的派生形式,因此ECMA-262将它们定义为表面上相等,如下所示:

console.log(null == undefined); // prints true
console.log(null === undefined);// prints false
Run Code Online (Sandbox Code Playgroud)