javascript变量的不同行为

时间:2012-07-20 06:37:02

标签: javascript

我在javascript中检查了未定义/未声明变量的不同行为。例如:

var obj = {};
console.log(x);//Error
console.debug(obj.x) ;//undefined

我的问题是虽然c和obj.x都没有声明或定义,但为什么我会得到差异行为? 我错过了什么吗? 我该如何跟踪哪个变量已经存在?

3 个答案:

答案 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.xx是属性而非变量,由于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

})()​