我在javascript中检查了未定义/未声明变量的不同行为。例如:
var obj = {};
console.log(x);//Error
console.debug(obj.x) ;//undefined
我的问题是虽然c和obj.x都没有声明或定义,但为什么我会得到差异行为? 我错过了什么吗? 我该如何跟踪哪个变量已经存在?
答案 0 :(得分:1)
这是javascript中的预期行为。如果您正在访问未声明的变量(x),则会发生错误,因为引擎不知道您要访问的内容。
另一方面,物体具有某种双重性质。它既充当对象又充当数组,即使给定键下的成员不存在,javascript也允许您尝试访问数组的成员。如果指定值下没有密钥,您将返回undefined
。
即以下两行是等效的
console.log(obj.x);
和
console.log(obj["x"]);
如果您尝试访问非现有变量的成员,则只会出错。 E.g。
console.log(obj.x.x);
答案 1 :(得分:1)
如果您尝试访问未定义的变量,则会出现错误,这通常是一件好事,因为它可以让您更轻松地找到错误。
如果要查明是否定义了变量,可以检查其类型:
console.info(typeof x === "undefined" ? "<undefined!>" : x);
对于obj.x
,x
是属性而非变量,由于JavaScript对象的动态特性,您始终可以查找属性。
答案 2 :(得分:1)
如果没有出现错误,则无法引用未声明的变量,除非您以非严格模式分配它,然后它变为隐式全局变量。但是在严格模式下仍然是错误。
尝试访问对象属性与尝试访问变量不同,尽管您可以从window
访问全局变量:
x; //referenceerror
window.x; //undefined, no reference error
<小时/> 在这种情况下,您需要使用
window.x
vs x
,例如:
var x = 5;
(function(){
var x = 3;
x === 3; //We cannot access the 5
window.x === 5 //Only window.x will do it here
})()