javascript变量的不同行为

Different behavior of javascript variables

本文关键字:变量 javascript      更新时间:2023-11-28

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

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

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

您不能引用未声明的变量而不将其作为错误,除非您在非严格模式下对其进行赋值,否则它将成为隐式全局变量。不过在严格模式下仍然存在错误。

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

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


在这种情况下,您需要使用window.xx,例如:

var x = 5;
(function(){
    var x = 3;

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

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

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

console.log(obj.x);

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

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

console.log(obj.x.x);

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

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

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

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