什么时候在JavaScript中用null初始化变量,还是根本不用?
我见过不同的代码示例,其中声明了变量并将其设置为未定义和null。例如:什么时候在JavaScript中用null初始化变量,还是根本不用?,javascript,variables,null,undefined,Javascript,Variables,Null,Undefined,我见过不同的代码示例,其中声明了变量并将其设置为未定义和null。例如: var a; // undefined - unintentional value, object of type 'undefined' var b = null; // null - deliberate non-value, object of type 'object' 如果这些声明后面的代码为a或b赋值,那么使用一种声明而不是另一种声明的原因是什么?第一个示例没有为变量赋值,因此它隐式引用了未定义的值(有关详细
var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'
如果这些声明后面的代码为a或b赋值,那么使用一种声明而不是另一种声明的原因是什么?第一个示例没有为变量赋值,因此它隐式引用了
未定义的值(有关详细信息,请参阅)。它通常在声明变量以供以后使用时使用。在必要之前,不需要显式地为它们分配任何内容
第二个示例被显式赋值为null
(它实际上是null
类型,但由于JavaScript规范的一个怪癖,它声称具有类型“object”)。它通常用于清除已存储在现有变量中的值。在清除值时使用null
更为稳健,因为可以覆盖未定义的
,在这种情况下,对未定义的
进行分类将导致意外行为
另一方面,null
的这种怪癖是使用更健壮的类型检查形式的一个很好的理由:
Object.prototype.toString.call(null); // Returns "[object Null]"
我刚刚看到这个链接,它澄清了我的问题。
面向Web开发人员的Javascript声明“当定义一个用于以后保存对象的变量时,建议将该变量初始化为null,而不是其他任何值。这样,您可以显式检查null值,以确定该变量在以后是否已被对象引用填充。”null是一个对象。。当某物未定义时,它就什么都不是。。它不是对象,也不是字符串,因为它尚未定义。。明显地那么它只是一个没有函数的属性
例如:
您使用var声明变量,但从未设置它
var foo;
alert(foo); //undefined.
尝试访问从未设置过的对象的属性
var foo = {};
alert(foo.bar); //undefined
您试图访问从未提供的参数
function myFunction (foo) {
alert(foo); //undefined.
}
我不认为有什么比这更好的方法,但我倾向于尽可能避免使用未定义的方法。可能是因为有很强的OOP背景
当我尝试用Javascript模拟OOP时,我通常会将变量显式声明并初始化为null(当您声明实例变量而不显式初始化它时,OOP语言也是如此)。
如果我不打算初始化它们,为什么还要首先声明它们呢?调试时,如果尚未为监视的变量设置值,则无论是否声明它,都会将其视为未定义
对于特定行为,我更喜欢保留未定义的
:
- 调用方法时,任何未提供的参数都将具有未定义的值。拥有可选参数的好方法,在未定义参数时实现特定行为
- 懒惰初始化。。。在我的书中,undefined的意思是“未初始化:去获取值”,null的意思是“已初始化,但值为null(例如可能有服务器错误?)
- arrays:myArray[myKey]==如果此键有空值,则为空;如果从未为此键设置过值,则为未定义
但是要小心,myVar==null
和myVar==undefined
返回相同的值,无论myVar是未定义的、null还是其他值。如果您想知道某个变量是否未定义,请使用=
。我会显式选择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第3版):
当定义一个变量用于以后保存一个对象时,它是
建议将变量初始化为null,而不是任何值
其他的这样,您就可以显式地检查null值
确定变量是否已在指定位置填充了对象引用
稍后,如本例中所示:
未定义的值是null的导数,因此ECMA-262将其定义为表面上相等,如下所示:
只是一张纸条。。。我认为toString()
的“[object Null]”
结果可能有一些浏览器不兼容。到最后一行,应该注意的是,除了Null
本身(因为它是一个“对象”)之外,没有任何东西===
(三重等于)Null
。如果我不打算初始化它们,为什么要首先声明它们?
因为您想用if..else语句设置值,但需要变量的作用域在if..else之外?虽然在JavaScriptvar
中有函数作用域,但这并不适用于本例。也许您可以编辑答案并添加一些参考链接和论证。只是把“良好实践”放在这里只是一种观点。我加了一本参考书,也只是一本书,不是标准
if (foo2 != null){
//do something with foo2
}
console.log(null == undefined); // prints true
console.log(null === undefined);// prints false