javascript - 'undefined' 和 'not defined' 之间的 Javascript 有什么区别?

标签 javascript

如果您尝试使用一个不存在且未声明的变量,javascript 将抛出错误。 var name is not defined,脚本将立即停止。

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

还有 var a;var b = undefined; 有什么区别?

最佳答案

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

typeof var === 'undefined'

而不是

var === undefined

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

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

是的,变量可以有未定义的值,您可以显式地为它们赋值。将 undefined 分配给一个变量可能会造成混淆,因为它有点自相矛盾(您已将变量定义为未定义)并且无法将该变量与不存在的变量区分开来或未初始化的变量。如果您想表示一个变量当前没有值,或者如果您想完全“取消声明”该变量,请使用 null,请使用 delete {varname}。将 undefined 分配给变量不会删除该变量的声明;如果你遍历它们,它仍然会出现在它拥有的对象的属性列表中,所以我想不出这对你有什么好处。

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

长版,摘自 ECMAScript spec , 是否存在 undefined variable 的特殊情况:

11.4.3 typeof UnaryExpression is evaluated as follows:

  1. Evaluate UnaryExpression (as per 10.1.4 this returns "a value of type Reference whose base object is null and whose property name is the identifier" if the variable is undeclared).
  2. If Type(Result(1)) is not Reference, go to step 4. (It is a Reference)
  3. If GetBase(Result(1)) is null, return "undefined". (This is the special case matching undefined variables)

至于您对第一个问题“如何对不存在的事物进行分类”的评论 - 很简单!简单地将所有概念分为存在的事物(例如松鼠、岩石)和不存在的事物(独 Angular 兽、曲速引擎)。这就是未定义的意思;不管它在英语中的语义如何,它的 Javascript 意思是变量还没有被声明或填充,所以虽然“一个名为 foo 的变量”的概念是有效的,但不存在变量这个名字具有真正的值(value)。

关于javascript - 'undefined' 和 'not defined' 之间的 Javascript 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/833661/

相关文章:

JavaScript 正则表达式 1-10

javascript - 更改悬停时的图像

javascript - 添加新消息时自动向下滚动

javascript - 在 Javascript 中镜像 N x N 邻接矩阵的一半

javascript - 如何将数组的元素作为单独的参数传递给函数?

javascript - jQuery json 对象 if 语句

php - 随机字体颜色

javascript - Angularjs 提供者 : Resolve $http request before returning

javascript - Jquery attr改变html结构

javascript - 可切换按钮不起作用