我想知道JavaScript中null和undefined之间的区别。
当前回答
我想添加一个与空和未定义之间的细微差别有关的知识点。当您尝试从头开始学习Vanilla JavaScript(JS)时,这一点很好:
null是JS中的保留关键字,而undefined是运行时环境的全局对象。
在编写代码时,这种差异是不可识别的,因为null和undefined总是在JavaScript语句的右侧(RHS)使用。但当你在表达式的左手边(LHS)使用它们时,你可以很容易地观察到这种差异。因此JS解释器将以下代码解释为错误:
var null = 'foo'
它给出以下错误:
未捕获语法错误:意外的标记null
同时,以下代码运行成功,尽管我不建议在现实生活中这样做:
var undefined = 'bar'
这是因为undefined是全局对象(如果JavaScript在浏览器中运行,则为窗口对象)上的一个属性
其他回答
null是一个特殊值,表示“无值”。null是一个特殊的对象,因为typeof null返回“object”。
另一方面,undefined表示变量尚未声明,或未给定值。
引自Marijn Haverbeke第三版《Elquent Javascript》:
undefined和null之间的含义差异是Javascript设计的一个意外,大多数时候这并不重要。如果你真的需要关注这些价值观,我建议你将它们视为可以互换的
老实说,一开始,我对这个建议有点怀疑。然而,在我自己的解释中,这是一种懒惰(或渴望)的方式来处理他们的分歧。也许,我们根本不需要处理这些差异。如果我们必须这样做,我们可以延迟我们的担忧(直到我们不得不这样做),而不是在这些值(null和undefined)流经我们的代码的每一步都过度/防御性地担心它。
PS:这不是对你问题的直接回答。这只是一个相关的观点。
除了不同的含义外,还有其他区别:
对象析构函数对这两个值的作用不同:常量{a=“默认”}={a:未定义};//a是“默认值”常量{b=“默认”}={b:null};//b为空JSON.stringify()保持null,但省略未定义const json=json.stringify({undefinedValue:undefined,nullValue:null});console.log(json);//打印{“nullValue”:null}运算符类型console.log(类型未定义);//“未定义”console.log(类型为空);//“object”而不是“null”
我从这里选的
未定义的值是当变量没有已分配值。空值是表示空的、空的和空的原始值,或不存在的引用。
当您通过var声明一个变量而不给它赋值时,它将具有未定义的值。就其本身而言,如果您尝试WScript.Echo()或alert()此值,您将看不到任何内容。但是,如果您在其中附加一个空白字符串,那么它会突然出现:
var s;
WScript.Echo(s);
WScript.Echo("" + s);
您可以声明一个变量,将其设置为null,行为是相同的,只是您将看到“null”与“undefined”打印出来。这确实是一个小差异。
您甚至可以将未定义的变量与null进行比较,反之亦然,条件将为true:
undefined == null
null == undefined
然而,它们被认为是两种不同的类型。虽然undefined是一种类型,但null被认为是一个特殊的对象值。通过使用typeof()可以看到这一点,它返回一个表示变量的常规类型的字符串:
var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));
运行上述脚本将产生以下输出:
undefined
object
无论它们是不同的类型,如果您尝试访问其中一个的成员,它们的行为仍然相同,例如,它们将抛出异常。使用WSH,你会看到可怕的“'varname'为空或不是对象”,如果你幸运的话(但这是另一篇文章的主题)。
您可以明确地将变量设置为未定义,但我强烈建议您不要这样做。我建议您只将变量设置成null,并将忘记设置的值保留为未定义。同时,我真的鼓励你总是设置每个变量。JavaScript的作用域链不同于C风格语言,即使是资深程序员也很容易混淆,将变量设置为null是防止基于它的错误的最佳方法。
另一个例子是使用delete运算符时,您将看到未定义的弹出窗口。我们这些来自C世界的人可能会错误地将此解释为破坏对象,但事实并非如此。此操作所做的是从数组中移除下标或从对象中移除成员。对于数组,它不影响长度,但现在认为下标未定义。
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,这通常是我们所做的。虽然我们可以将变量设置为undefineed,但我们更喜欢null,因为这不是我们曾经做过的事情。当您调试时,这意味着任何设置为null的事情都是您自己做的,而不是JavaScript。除此之外,这两个特殊值几乎相等。
对于未定义的类型,只有一个值:undefined。
对于null类型,只有一个值:null。
因此,对于这两种情况,标签既是其类型,也是其值。
他们之间的区别。例如:
null是空值undefined是一个缺失的值
Or:
undefined还没有值null有一个值,但不再存在
实际上,null是一个特殊的关键字,而不是标识符,因此不能将其视为要赋值的变量。
然而,undefined是一个标识符。然而,在非严格模式和严格模式下,都可以创建一个名为undefined的局部变量。但这是一个可怕的想法!
function foo() {
undefined = 2; // bad idea!
}
foo();
function foo() {
"use strict";
undefined = 2; // TypeError!
}
foo();
推荐文章
- Javascript和regex:分割字符串并保留分隔符
- 如何检查DST(日光节约时间)是否有效,如果是,偏移量?
- 如何打破_。在underscore.js中的每个函数
- 如何在jQuery中获得当前日期?
- 如何创建一个日期对象从字符串在javascript
- 输入触发器按钮单击
- 获取对象的属性名
- 如何检查用户是否可以回到浏览器历史
- 相当于字符串。jQuery格式
- 如何在vue-cli项目中更改端口号
- Angular 2模板中的标签是什么意思?
- JavaScript .includes()方法的多个条件
- 窗口。亲近与自我。close不关闭Chrome中的窗口
- 同步和异步编程(在node.js中)的区别是什么?
- 在d3.js中调整窗口大小时调整svg的大小