1

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

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

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

4

3 回答 3

1

这是 javascript 中的预期行为。如果您正在访问未声明的变量 (x),则会发生错误,因为引擎不知道您要访问的内容。

另一方面,物体具有某种双重性质。它既充当对象又充当数组,javascript 允许您尝试访问数组的成员,即使给定键下的成员不存在。如果没有指定值以下的键,您将返回undefined。即以下两行是等价的

console.log(obj.x);

console.log(obj["x"]);

如果您尝试访问不存在变量的成员,您只会得到错误。例如

console.log(obj.x.x);
于 2012-07-20T06:43:25.970 回答
1

如果你试图访问一个未定义的变量,你会得到一个错误,这通常是一件好事,因为它可以让你更容易地找到错误。

如果你想知道一个变量是否被定义,你可以像这样检查它的类型:

console.info(typeof x === "undefined" ? "<undefined!>" : x);

在 的情况下obj.xx是属性而不是变量,由于 JavaScript 对象的动态特性,您始终可以查找属性。

于 2012-07-20T06:46:48.370 回答
1

你不能引用一个未声明的变量而不是一个错误,除非你在非严格模式下分配它然后它变成一个隐式全局。虽然在严格模式下仍然出错。

尝试访问对象属性与尝试访问变量不同,尽管您可以从以下位置访问全局变量window

x; //referenceerror
window.x; //undefined, no reference error


你需要在这种情况下使用window.xvsx例如:

var x = 5;

(function(){
    var x = 3;


    x === 3; //We cannot access the 5 
    window.x === 5 //Only window.x will do it here

})()​
于 2012-07-20T06:47:00.690 回答