Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候在JavaScript中用null初始化变量,还是根本不用?_Javascript_Variables_Null_Undefined - Fatal编程技术网

什么时候在JavaScript中用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赋值,那么使用一种声明而不是另一种声明的原因是什么?第一个示例没有为变量赋值,因此它隐式引用了未定义的值(有关详细

我见过不同的代码示例,其中声明了变量并将其设置为未定义和null。例如:

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之外?虽然在JavaScript
var
中有函数作用域,但这并不适用于本例。也许您可以编辑答案并添加一些参考链接和论证。只是把“良好实践”放在这里只是一种观点。我加了一本参考书,也只是一本书,不是标准
if (foo2 != null){
    //do something with foo2
}
console.log(null == undefined); // prints true
console.log(null === undefined);// prints false