如果您尝试使用一个不存在且未声明的变量,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:
- 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).
- If Type(Result(1)) is not Reference, go to step 4. (It is a Reference)
- 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/