javascript变量的不同行为

javascript变量的不同行为,javascript,Javascript,我已经检查了javascript中未定义/未声明变量的不同行为。例如: var obj = {}; console.log(x);//Error console.debug(obj.x) ;//undefined 我的问题是,虽然c和obj.x都没有声明或定义,但为什么我会得到不同的行为? 我错过什么了吗? 我应该如何跟踪哪个变量已经存在或不存在 这是javascript中的预期行为。如果您正在访问未声明的变量(x),则会发生错误,因为引擎不知道您要访问什么 另一方面,对象具有某种双重性质。它

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

var obj = {};
console.log(x);//Error
console.debug(obj.x) ;//undefined
我的问题是,虽然c和obj.x都没有声明或定义,但为什么我会得到不同的行为? 我错过什么了吗?
我应该如何跟踪哪个变量已经存在或不存在

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

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

console.log(obj.x);

只有尝试访问不存在的变量的成员时,才会出现错误。例如

console.log(obj.x.x);

如果您试图访问一个未定义的变量,您将得到一个错误,这通常是一件好事,因为它允许您更容易地找到bug

如果要确定是否定义了变量,可以检查其类型,如下所示:

console.info(typeof x === "undefined" ? "<undefined!>" : x);
console.info(类型x==“未定义”?:x);

obj.x
的情况下,
x
是一个属性而不是一个变量,由于JavaScript对象的动态特性,您可以随时查找属性。

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

尝试访问对象属性与尝试访问变量不同,尽管您可以从
窗口
访问全局变量:

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

})()​

这里出现了另一个问题。我们知道window是全局对象,并且声明的变量附加到它。x和window之间的区别是什么?@radhe001
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

})()​