“未定义”和“未定义”在 Javascript 中有什么区别?

IT技术 javascript
2021-02-28 08:49:57

如果您尝试使用不存在且尚未声明的变量,javascript 将抛出错误。var name is not defined, 脚本将在那时和那里停止。

但是,如果您使用检查它,typeof noname那么它将返回"undefined". 我一直认为你必须声明一个 var 才能有一个类型。要么使用:var a; 所以它的类型是 undefined 或者通过给它一个像var b =5;这样的值:所以它有它的值的类型。

此外之间有什么区别var a;var b = undefined;

6个回答

未声明的变量(即不存在的变量)没有类型 - 因此它的类型未定义的。我相信测试某些东西是否未定义的普遍接受的方法是

typeof var === 'undefined'

而不是

var === undefined

因为如果变量不存在,您将无法访问它。如果您确定变量应该存在,后一种情况可能更有用,因为两者之间的区别在于未声明的变量在第一种情况下将返回 false,但在第二种情况下会导致错误。

如果您使用第二个变体,请确保使用三重等号运算符;(更常见的)双等号运算符执行类型强制,因此null == undefined为真而null === undefined为假。有时您可能想要第一种行为,但通常您会想要第二种行为,尤其是当您针对 undefined 进行测试时,因此识别差异很重要。(这是第一种情况的另一个好处,因为不可能犯这种微妙的错误)。

是的,变量的值可以是 undefined,您可以明确地为它们赋值。分配undefined给变量虽然可能会令人困惑,因为它有点自相矛盾(您已将变量定义为未定义)并且无法将该变量与不存在的变量或未初始化的变量区分开来。如果要表示变量当前没有值,或者要完全“取消声明”该变量,请使用 null,请使用delete {varname}. 将 undefined 赋值给一个变量不会删除该变量的声明;如果您迭代它们,它仍然会出现在其拥有对象的属性列表中,所以我想不出任何对您有益的情况。

编辑:为了回应评论,当用 === (或 ==)比较值时,必须推迟变量以获得其当前值才能进行比较。由于该变量不存在,因此取消引用失败(目前没有真正的惊喜)。虽然您可能期望 typeof 运算符以类似的方式工作(获取当前值,查看它的类型是什么),但它特别适用于未定义的变量。“简短版本”(如Mozilla 参考所用)只是“typeof 运算符返回一个字符串,指示未计算的操作数的类型”。

ECMAScript 规范中提取的长版本是未定义变量的特殊情况:

11.4.3 typeof UnaryExpression的计算如下:

  1. 评估UnaryExpression(根据 10.1.4,如果变量未声明,则返回“一个类型 Reference 的值,其基对象为null,其属性名称为标识符”)。
  2. 如果 Type(Result(1)) 不是 Reference,则转到第 4 步。(It is a Reference)
  3. 如果 GetBase(Result(1)) 为null,则返回“未定义”。(这是匹配未定义变量的特殊情况)

至于你对第一个问题的评论,“你如何对不存在的东西进行分类”——很简单!只需将所有概念分为确实存在的事物(例如松鼠、岩石)和不存在的事物(独角兽、曲速引擎)。这就是 undefined 的意思;不管它在英语中的语义如何,它的 Javascript 含义是该变量尚未声明或填充,因此虽然“名为 foo 的变量”概念是有效的,但不存在具有该名称的变量具有实际值。

问题为什么 typeof noname 不会像 var === undefined 那样窒息?我不是在访问 var 吗?上面还对上一篇文章发表了有趣的评论,但我认为这也与这篇文章有关。谢谢
2021-05-03 08:49:57
“在第一种情况下,未声明的变量将返回 false”至少不在我的控制台中。
2021-05-13 08:49:57

JavaScript 提供了几种不同的缺失或空变量(和对象属性)的概念:

  1. 实际上“未定义”的变量,即它们不存在,因为给定的名称在当前词法环境中不受约束。访问这样的变量会抛出错误,但使用typeof不会并且会返回'undefined'相反,访问不存在的属性不会抛出错误并返回undefined(并且您可以使用in运算符或hasOwnProperty()方法来检查属性是否确实存在)。

  2. 尚未分配值的现有变量(由于var 提升而很常见)或已显式设置为undefined. 访问这样的变量将返回undefinedtypeof将返回'undefined'

  3. 已显式设置为的现有变量null访问这样的变量将返回nulltypeof将返回'object'请注意,这是一种误导:null它不是一个对象,而是一个Null类型的原始值(这会导致您无法null从构造函数返回- 您必须抛出错误来表示失败)。

我推荐以下做法:

  1. 使用typeof检查undefined,因为它会覆盖前两种情况。
  2. 不要分配undefined属性:使用delete来摆脱它们;请注意,您不能删除变量(但还要注意,全局变量实际上是全局对象的属性,因此可以删除)。
  3. 使用null如果要清除一个变量作为一个暗示,垃圾收集器,以纪念缺少一个有意义的值(如链接列表的最后一个节点前参考)或。

您也可以使用undefined3. 并且根本不使用null

我相信这是同一事物的 JavaScript 定义和萤火虫之间的区别。

未定义只是尚未定义为值的事物的状态。所以它没有类型。

还有 var a; 有什么区别?和 var b = 未定义;

var a; alert(a); // undefined
a; alert(a); // "Error "a" not defined"
a = undefined; alert(a); // undefined

第二个示例不是有效的 JavaScript 代码,执行将停止。因为这是一个错误。

我认为 undefined 它的 self 也是一种类型?即原始类型。根据字典,未定义的定义之一是:“赋予形式或意义”,对我来说未定义就像说它没有意义。但如果它首先不存在,那么它怎么可能没有意义。你如何对不存在的东西进行分类?感谢您的帮助和其他任何人。
2021-05-10 08:49:57

alert(a);

这里a没有定义。

alert(a);
var a=10;

a是未定义的,因为javascript引擎将此代码转换为

var a;
alert(a); // that's why `a` is defined here 
a=10;
  • 未定义 - 未声明和使用实例;
  • undefined - 声明和使用的实例没有它的值。