40 javascript
如果您尝试使用不存在且尚未声明的变量,则javascript将引发错误.var name is not defined,然后脚本就会停止.
但如果你使用它来检查它typeof noname,它将返回"undefined".我一直认为你必须声明一个var才能拥有一个类型.通过使用:var a; 因此它具有未定义的类型或赋予它类似的值:var b =5;所以它具有其值的类型.
此外之间有什么区别var a;和var b = undefined;?
And*_*yle 24
未声明的变量(即,一个不存在的)不具有一个类型-因此其类型是未定义的.我相信普遍接受的测试方法是否未定义的方法是
typeof var === 'undefined'
Run Code Online (Sandbox Code Playgroud)
而不是
var === undefined
Run Code Online (Sandbox Code Playgroud)
因为如果变量不存在,则无法访问它.如果您确定变量应该存在,后一种情况可能会更有用,因为两者之间的差异是未声明的变量在第一种情况下将返回false但在第二种情况下会导致错误.
如果您使用的是第二种变体,请确保使用三等号运算符; (更常见的)双等于运算符执行类型强制,因此null == undefined如果null === undefined为false则为true.有时您可能想要第一个行为,但通常您会想要第二个行为,特别是如果您正在测试未定义的行为,因此识别差异非常重要.(这是第一种情况的另一个好处,因为它不可能产生这种微妙的错误).
是的,变量的值可以是undefined,您可以为它们显式赋值.undefined虽然分配给变量可能令人困惑,因为它有点悖论(你已经将变量定义为未定义)并且不可能将该变量与不存在的变量或未初始化的变量区分开来.如果要表示变量当前没有值,或者如果要完全"取消声明"变量,请使用null,使用delete {varname}.将undefined赋值给变量不会删除该变量的声明; 如果你遍历它们,它仍会出现在它拥有对象的属性列表中,所以我想不出任何会对你有益的情况.
编辑:响应注释,在将值与===(或==)进行比较时,必须引用变量以获取其当前值以进行比较.由于该变量不存在,因此该解除引用失败(到目前为止没有真正的意外).虽然您可能希望typeof运算符以类似的方式工作(获取当前值,查看其类型),但它特别适用于未定义的变量."短版本"(由Mozilla引用使用)只是"typeof运算符返回一个字符串,指示未评估的操作数的类型."
从ECMAScript规范中提取的长版本是未定义变量的特殊情况:
11.4.3 typeof UnaryExpression的计算方法如下:
- 评估UnaryExpression(根据10.1.4,它返回"类型为Reference的值,其基础对象为null,如果变量未声明,则其属性名称为标识符").
- 如果Type(Result(1))不是Reference,请转到步骤4.(这是参考)
- 如果GetBase(Result(1))为null,则返回"undefined".(这是匹配未定义变量的特殊情况)
至于你对第一个问题的评论,"你怎么能分类不存在的东西" - 这很简单!简单地将所有概念划分为存在的东西(例如松鼠,岩石)和不存在的东西(独角兽,翘曲驱动器).这就是未定义的意思; 不管它的英文语义如何,它的Javascript含义是该变量尚未被声明或填充,因此虽然"一个名为foo的变量" 的概念是有效的,但是不存在具有该实名值的变量.
Chr*_*oph 17
JavaScript提供了几种不同的缺失或空变量(和对象属性)概念:
实际上"未定义"的变量,即它们不作为给定名称存在,不受当前词法环境的约束.访问这样的变量将引发错误,但使用typeof不会并将返回'undefined'.相反,访问不存在的属性不会抛出错误undefined而是返回(并且您可以使用in运算符或hasOwnProperty()方法来检查属性是否确实存在).
尚未赋值的现有变量(由于var提升而常见)或已明确设置的值undefined.访问这样的变量将返回undefined,typeof将返回'undefined'.
已明确设置的现有变量null.访问这样的变量将返回null,typeof将返回'object'.请注意,这是误导性的:null不是对象,而是Null类型的原始值(其结果是您无法null从构造函数返回- 您必须抛出错误来表示失败).
我推荐以下做法:
typeof检查undefined,因为它会覆盖前两种情况.undefined给属性:delete用来取代它们; 请注意,您无法删除变量(但请注意,全局变量实际上是全局对象的属性,因此可以删除).null如果要清除一个变量作为一个暗示,垃圾收集器,以纪念缺少一个有意义的值(如链接列表的最后一个节点前参考)或.你也可以选择undefined3.并且根本不用null.
我相信这是 JavaScript 定义和同一事物的 firebug 之间的差异。
未定义只是尚未定义为值的事物的状态。所以它没有类型。
另外 var a; 和有什么区别?var b = 未定义;
var a; alert(a); // undefined
a; alert(a); // "Error "a" not defined"
a = undefined; alert(a); // undefined
Run Code Online (Sandbox Code Playgroud)
第二个示例不是有效的 JavaScript 代码,执行将停止。因为这是一个错误。
| 归档时间: |
|
| 查看次数: |
28885 次 |
| 最近记录: |