在JavaScript中,null和undefined有什么区别?

13 浏览
0 Comments

在JavaScript中,null和undefined有什么区别?

在JavaScript中,nullundefined有什么区别?

0
0 Comments

JavaScript中的null和undefined有什么区别?

undefined是一个原始值,用于表示变量未被赋值。

null是一个原始值,表示空、不存在或不存在的引用。

当通过var声明一个变量但不给它赋值时,它的值将是undefined。单独使用时,如果尝试WScript.Echo()或alert()这个值,将不会显示任何内容。然而,如果将一个空字符串附加到它上面,它将突然出现:

var s;
WScript.Echo(s);
WScript.Echo("" + s);

可以声明一个变量,将其设置为null,行为与undefined相同,只是打印出来的是"null"而不是"undefined"。这确实是一个很小的区别。

甚至可以将一个未定义的变量与null进行比较,条件将为真:

undefined == null
null == undefined

然而,它们被认为是两种不同的类型。虽然undefined是一个独立的类型,但null被认为是一个特殊的对象值。可以通过使用typeof()来查看这一点,它返回一个表示变量一般类型的字符串:

var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));

运行上面的脚本将输出以下内容:

undefined
object

尽管它们是不同的类型,但如果尝试访问其中一个的成员,它们仍然会以相同的方式工作,即抛出异常。使用WSH时,将看到可怕的"'varname' is null or not an object",如果你很幸运的话(但这是另一篇文章的话题)。

可以显式地将一个变量设置为undefined,但我强烈建议不要这样做。我建议只将变量设置为null,并将undefined作为你忘记设置的值。同时,我真的鼓励你始终设置每个变量。JavaScript具有不同于C风格语言的作用域链,即使是有经验的程序员也容易混淆,将变量设置为null是防止基于此产生错误的最佳方法。

当使用delete操作符时,也会出现undefined。我们来自C世界的人可能会错误地将其解释为销毁一个对象,但事实并非如此。这个操作的作用是从数组中删除一个下标或从对象中删除一个成员。对于数组,它不会影响长度,而是将该下标视为undefined。

var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]));

上面脚本的结果是:

0.) a
1.) undefined
2.) c

当读取一个从未存在的下标或成员时,也会返回undefined。

null和undefined之间的区别是:JavaScript永远不会将任何东西设置为null,通常是我们自己这样做。虽然我们可以将变量设置为undefined,但我们更喜欢null,因为它不是JavaScript为我们做的事情。在调试时,这意味着任何设置为null的内容都是你自己做的,而不是JavaScript。除此之外,这两个特殊值几乎是等价的。

这是一个很好的答案。但要指出的是,当你检查"undefined == null"时,类型检查不是严格的。因此它返回"true"。如果你检查"undefined === null",它将返回false。

值得注意的是,虽然这个评论在2011年是正确的,但随着可选的函数参数的出现,Flow等类型检查系统的出现以及React的普及(它们都对undefined和null有很大的区别),通常使用null而不是undefined的旧智慧不再那么严格。在许多情况下,当您想要明确使用默认值时(例如,对于可选参数或可选的React属性),undefined实际上比null更可取。

从blog.devgenius.io/…中得知“在我看来,最好根本不使用null,而是优先使用undefined。”

0
0 Comments

在JavaScript中,null和undefined之间的区别可以通过卫生纸架来解释:

- 非零值就像是带有卫生纸卷的纸架,纸卷上还有纸。

- 零值就像是带有空的卫生纸卷的纸架。

- null值就像是一个连卫生纸卷都没有的纸架。

- undefined值则类似于纸架本身丢失了。

这个问题的原因是因为作者在回答关于图片来源的问题时,用了这个比喻来解释null和undefined的区别。解决方法是作者进一步解释了他对这个比喻的理解,并提出了对比喻的不同观点。

根据作者的解释,undefined更接近于null,因为他记得这个图片来自imgur网站,所以并不完全是未知的。而null则更像是“我不知道它来自哪里”。

作者和其他用户之间对于这个比喻的理解也有所不同。有人认为undefined是一个空的纸架,而null是一个带有“空”便签的空纸架。这也解释了为什么很多开发者会感到困惑:我应该在未初始化的变量上放一个“空”的便签,还是每个人都会明白“空”意味着空?例如,缺乏卫生纸是有意的还是无意的?

最后,有人提出了RAM(内存)是浴室的比喻,但也有人认为RAM应该是清洁工的手。

总之,null和undefined在JavaScript中的区别可以用卫生纸架的比喻来解释。然而,不同的人可能对这个比喻有不同的理解,所以我们需要根据具体的语境来理解它们之间的区别。

0
0 Comments

JavaScript中的null和undefined之间的区别是什么?

undefined表示变量已经声明但尚未被赋值:

var testVar;
console.log(testVar); //显示undefined
console.log(typeof testVar); //显示undefined

null是一种赋值值,可以将其赋给变量作为没有值的表示:

var testVar = null;
console.log(testVar); //显示null
console.log(typeof testVar); //显示object

从上面的例子可以看出,undefined和null是两种不同的类型:undefined是一种类型本身(undefined),而null是一个对象。

证明:

console.log(null === undefined) // false(不是相同的类型)
console.log(null == undefined) // true(但是“相同的值”)
console.log(null === null) // true(类型和值都相同)

null = 'value' // Uncaught SyntaxError: invalid assignment left-hand side

undefined = 'value' // 'value'

引用来自《专业的JS Web开发者》一书的内容:“你可能会想为什么typeof运算符对于一个值为null的情况返回的是'object'。这实际上是原始JavaScript实现中的一个错误,然后在ECMAScript中被复制。今天,人们认为null被视为对象的占位符,尽管从技术上讲它是一个原始值。”

变量也可以不定义。例如:

console.log(typeof(abc)); //显示undefined

从上述例子中可以看出,没有定义变量的情况下,变量就好像根本没有定义一样。

一些评论指出,如果我想要一个变量一开始没有值,我会写“...= null”,例如“myvar = null”。这样,当我错误地写成“if (myxar == null) {...}”时,if块就不会执行。而对于undefined,我就没有这个优势:myvar = undefined; myvar = 4; if (typeof myxar == "undefined") { ...}

所以基本上null值意味着一个变量已经被明确设置为(没有值= null)或已经被初始化并定义为无。而undefined则意味着它可能从未被初始化过,或者如果它被初始化过,那么它从未被定义过。

为什么null==undefined返回true?

这很奇怪,但如果你使用===(正确的相等运算符),它们就不是相等的。这是因为类型是不同的,null是一个对象,而undefined是未定义的。请参考此链接以了解更多信息。

undefined表示变量已经声明但尚未被赋值,但实际上并非如此。例如:var a = {};然后a.abc === undefined为true,但如果你执行a.n=undefined;,现在a就是{a:undefined},无论变量是否被声明,它都是undefined!

从上述例子可以看出,没有必要将undefined和null作为单独的概念。

有些情况下,测试undefined而不是null是有意义的,例如:如果你使用作为某种数据类型的动态容器的关联数组...你可能不知道哪个索引存在,所以你必须先找出来:if (typeof niceArray['index1']['option_xy'] !== 'undefined') { ... }即使标识符从未被声明,typeof也会返回'undefined'...非常酷...而且你不能用null来代替测试,因为JavaScript会抛出引用错误。

我同意,不要根据你在键盘上按错键的频率来编写程序。说得好。

我认为一个现实生活的例子更好,我声明了一个变量node,var node。如果这个变量没有值,node == null和node == undefined都是true。如果我想知道这个变量是否被声明,我使用node === undefined,结果是false。这些是条件语句的最常见做法。有些人也会使用node == undefined来检查需要被声明的变量,我认为这是不好的做法。null提供了有关变量的信息,表示我需要被声明。这对开发人员来说是有用的信息。

然而,这是不正确的。在node尚未声明的情况下检查node === undefined将抛出ReferenceError,因为node确实是未定义的。你可能想要检查typeof node === "undefined"。

还值得一提的是,自从撰写本答案以来,ES6引入了默认函数参数,它们对null和undefined的处理方式不同。对于function foo(bar = 'default') { return bar; },foo(null) === null,但foo() === foo(undefined) === 'default'。React的props也类似,因此现在比以前有更多的原因故意传递undefined而不是null。

此外,null不是对象,typeof运算符返回的是对象,这是JS中的一个错误,但null与undefined或Boolean一样是一种原始数据类型。

就我看来,null不是一种类型,而是一种值。在我看来,JS说null是什么类型是任意的,询问“null的类型是什么”没有特别的意义-在任何语言中都是如此。正如你所知,它是一个预定义的值,你将其分配给一个变量,以便以后可以询问“这个变量的值是null吗?”例如:x = null; ... if (x === null) ...。问“这个变量是null类型的吗?”没有意义。

x = {}然后x["hede"] === undefined是true,所以"undefined表示变量已经声明但尚未被赋值"这个说法令人困惑,可能是错误的。

如果某个东西是未定义的,这意味着它尚未被分配。如果某个东西是null,这意味着它被分配了一个null值。

在这个例子中,基本上每个想得到的对象属性都是“隐式声明”的。这与处理“未声明”的属性的其他实例一致,因此从这个角度来看,该说法仍然是正确的。

从这个答案被标记为正确来看,问题可能更多地是说“声明”而意图是“初始化”。

为什么这个答案被标记为正确?你可以将undefined赋给一个变量“let foo = undefined;”

我赞同消除其中之一。在这两种情况下都没有值,它只会在测试案例中带来麻烦。数据要么存在,要么不存在。意图让一个变量为空不应该以我们开发人员之间的混淆和复杂性为代价。我无法想象一个单独使用null会有用的情况。

0