如果您尝试使用不存在且尚未声明的变量,则javascript将引发错误。 var name is not defined
,然后脚本就会停止。
但如果您使用typeof noname
进行检查,则会返回"undefined"
。我一直认为你必须声明一个var才能拥有一个类型。通过使用:var a;所以它具有未定义的类型或赋予它类似的值:var b =5;
所以它具有其值的类型。
var a;
和var b = undefined;
之间有什么区别?
答案 0 :(得分:24)
未声明的变量(即,不存在的变量)没有类型 - 因此其类型 未定义。我相信普遍接受的测试方法是否未定义的方法是
typeof var === 'undefined'
而不是
var === undefined
因为如果变量不存在,则无法访问它。如果您确定变量应该存在,后一种情况可能会更有用,因为两者之间的差异是未声明的变量在第一种情况下将返回false但在第二种情况下会导致错误。
如果您使用的是第二种变体,请确保使用三等号运算符; (更常见的)双等于运算符执行类型强制,因此null == undefined
为真,而null === undefined
为假。有时您可能想要第一个行为,但通常您会想要第二个行为,特别是如果您正在测试未定义的行为,因此识别差异非常重要。 (这是第一种情况的另一个好处,因为它不可能产生这种微妙的错误。)
是的,变量的值可以是undefined,您可以为它们显式赋值。尽管将undefined
分配给变量可能会令人困惑,因为它有点悖论(您已将变量定义为未定义)并且无法将该变量与不存在的变量或未初始化的变量区分开来。如果要表示变量当前没有值,或者如果要完全“取消声明”变量,请使用null,使用delete {varname}
。将undefined赋值给变量不会删除该变量的声明;如果你遍历它们,它仍然会出现在它拥有对象的属性列表中,所以我想不出任何会对你有益的情况。
编辑:在回复注释时,在将值与===(或==)进行比较时,必须引用该变量以获取其当前值以进行比较。由于该变量不存在,因此该解除引用失败(到目前为止没有真正的意外)。虽然您可能希望typeof运算符以类似的方式工作(获取当前值,查看其类型),但它特别适用于未定义的变量。 “短版本”(由Mozilla reference使用)只是“typeof运算符返回一个字符串,指示未评估的操作数的类型。”
从ECMAScript spec中提取的长版本是未定义变量的特例:
11.4.3 typeof UnaryExpression 评估如下:
- 评估 UnaryExpression (根据10.1.4,它返回“类型为Reference的值,其基础对象为 null ,其属性名称为标识符”,如果变量为未公布的)。
- 如果Type(Result(1))不是Reference,请转到步骤4.(这是参考)
- 如果GetBase(Result(1)) null ,则返回“undefined”。 (这是匹配未定义变量的特殊情况)
醇>
至于你对第一个问题的评论,“你怎么能对不存在的东西进行分类” - 这很简单!简单地将所有概念划分为存在的东西(例如松鼠,岩石)和不存在的东西(独角兽,翘曲驱动器)。这就是未定义的意思;无论它的英文语义是什么,它的Javascript含义是该变量尚未被声明或填充,因此当“一个名为foo的变量”的概念有效时,不存在变量这个名字具有真正的价值。
答案 1 :(得分:16)
JavaScript提供了几种不同的缺失或空变量(和对象属性)概念:
实际上“未定义”的变量,即它们不作为给定名称存在,不会绑定在当前词法环境中。访问此类变量会引发错误,但使用typeof
将不会返回'undefined'
。相反,访问不存在的属性不会引发错误并返回undefined
(您可以使用in
运算符或hasOwnProperty()
方法来检查属性是否确实存在)。
尚未分配值的现有变量(由于var hoisting而常见)或已明确设置为undefined
。访问此类变量将返回undefined
,typeof
将返回'undefined'
。
已明确设置为null
的现有变量。访问此类变量将返回null
,typeof
将返回'object'
。请注意,这是误导:null
不是对象,而是 Null 类型的原始值(其结果是您无法从构造函数返回null
- 你必须抛出错误而不是表示失败。)
我建议采用以下做法:
typeof
检查undefined
,因为它将涵盖前两种情况。undefined
分配给属性:使用delete
来取消它们;请注意,您无法删除变量(但请注意,全局变量实际上是全局对象的属性,因此可以删除)。null
标记缺少有意义的值(例如,链接列表的最后一个节点的前向引用),或者如果要将变量清除为垃圾收集器的提示。您也可以使用undefined
获取3.并且根本不使用null
。
答案 2 :(得分:4)
我认为这是同一件事的JavaScript定义和萤火虫之间的区别。
未定义只是尚未定义为值的某种状态。所以它没有类型。
var a之间有什么区别;和var b =未定义;
var a; alert(a); // undefined
a; alert(a); // "Error "a" not defined"
a = undefined; alert(a); // undefined
第二个示例不是有效的JavaScript代码,执行将停止。由于这是一个错误。
答案 3 :(得分:3)
alert(a);
此处a
未定义。
alert(a);
var a=10;
此处a
未定义,因为javascript
引擎将此代码转换为
var a;
alert(a); // that's why `a` is defined here
a=10;
答案 4 :(得分:2)
未定义:已声明,但未在我们访问该值的上方赋值 在其他词中,它存在但值未赋值
'未定义':这是一个错误,向编码器/程序员/用户表明该变量在范围内不存在。不在范围内声明。
var a = 1;
console.log(a) //1
var b;
console.log(b) //undefined
console.log(c) //undefined
var c=2;
console.log(d) //undefined
var d;
e=3
console.log(e) //3
var e;
console.log(f) //Uncaught ReferenceError: f is not defined
> Note: the default behavior of javaScript moving declarations to the > top >So the above code is look like below internally
var a = 1, b, c, d, e;
console.log(a) //1
console.log(b) //undefined
console.log(c) //undefined
c=2;
console.log(d) //undefined
e=3
console.log(e) //3
console.log(f) //Uncaught ReferenceError: f is not defined
答案 5 :(得分:0)
Javascript内存中不存在未声明的变量,而声明的变量可以设置为未定义。
差异是由Javascript设计混淆造成的。如果变量的值未定义,则应删除它。实际上,像0,“”,null和undefined这样的虚假值基本上都没有意义和相同。浪费了很多时间。它们都没有,也不存在。有多种类型的东西是非常矛盾的,或者甚至可以允许一种类型。
因此我认为你应该避免在完全编程时明确使用伪值。当他们无法通过更好的方法消除时,我还没有找到一个案例,如果没有它们,编程会更好。
答案 6 :(得分:0)
未定义:
未声明或初始化变量。引发参考错误
示例:
console.log(newvariable); // results: ReferenceError: newvariable is not defined
未定义:
声明为没有值的变量将具有未定义的值。
示例:
var newVar;
console.log(newVar); // results: undefined
答案 7 :(得分:0)