js中判断对象是否存在的10种方法综述

Javascript语言的设计不够严谨,很多地方在不小心的时候会出错。
例如,请考虑以下内容。
现在,我们要判断一个全局对象myobj时存在的,如果它不存在,我们将宣布它。在自然语言描述的算法如下:
复制代码代码如下所示:
如果(myobj时不存在){

申报myobj时;

}

你可能会认为写这个代码很简单,但实际上,它涉及的是比我们想象的更复杂的语法问题。Juriy Zaytsev指出,有超过50的方法来判断一个对象是否存在。只有对Javascript脚本语言实现的细节都很清楚,所以他们可以区分。

第一种写作方法
根据直觉,你可能认为它可以这样写:
复制代码代码如下所示:
如果(!MyObj){

myobj时= { };

}

然而,运行此代码,浏览器会把referenceerror误差直接导致中断运行。错误在哪里,好吗
顺便说一句,if语句判断myobj时是空的,这个变量是不存在的,所以说是错误的,改成下面这样可以正确运行。
复制代码代码如下所示:
如果(!MyObj){

VaR myobj时= { };

}

为什么不在添加var后犯错误呢在这种情况下,当if语句判断,是myobj时已经存在的吗
要回答这个问题,您必须知道Javascript解释器是如何工作的。
复制代码代码如下所示:
Var myObj;

如果(!MyObj){

VaR myobj时= { };

}

所以,当if语句判断myobj时确实存在,所以它是没有错的。这是提升功能的VaR的Javascript解释器的命令。只有增强VAR命令定义的变量,它不工作,不使用变量VAR的命令和分配直接。这就是var不增加错误的原因。

写作的第二种方式
除了var命令之外,还有另一种重写,可以得到正确的结果。
复制代码代码如下所示:
如果(!窗口。myobj时){

myobj时= { };

}

窗口是Javascript的顶级对象,所有全局变量的属性。因此,判断myobj时是空的等价于判断窗口对象myobj时属性,这样就可以避免错误,因为referenceerror myobj时没有定义。然而,从代码规范,最好是加入VaR第二行。
复制代码代码如下所示:
如果(!窗口。myobj时){

VaR myobj时= { };

}

或者像这样写:

如果(!窗口。myobj时){

window.myobj = { };

}

写作的第三种方式
上述方法的缺点是,在某些运行环境(如V8、犀牛)中,窗口不一定是顶层对象,因此,考虑将其重写为:
复制代码代码如下所示:
如果(!本。myobj时){

this.myobj = { };

}

在全局变量级别,这个关键字总是指向顶层变量,因此它可以独立于不同的运行时环境。

写作的第四种方式
然而,上面的文字可读性差,而且这个方向是可变的和容易出错的,因此需要进一步重写:
复制代码代码如下所示:
全局变量=这个;

如果(!全球。myobj时){

global.myobj = { };

}

很明显,顶层对象是用自定义变量全局表示的。

写作的第五种方式
你也可以使用typeof运算符判断myobj时定义。
复制代码代码如下所示:
如果(typeof = = { myobj时未定义)

VaR myobj时= { };

}

这是最广泛使用的判断Javascript对象是否存在的方法。

写作的第六种方式
因为这个定义,但不指定的值等于myobj时未定义的,因此上述方法可简化:
复制代码代码如下所示:
如果(myobj时= = undefined){

VaR myobj时= { };

}

有两个需要注意的地方,对var关键字第一第二行不小,否则会有referenceerror误差,其次是未定义的单或双引号,因为这里是未定义的数据类型的比较,而不是字符串未定义。

写作的第七种方式
精确(=)情况下的上述措辞仍然有效:
复制代码代码如下所示:
如果(myobj时= undefined){

VaR myobj时= { };

}

写作的第八种方式
根据Javascript语言的设计,定义为零,所以myobj时等于零,但也能得到正确的结果:
复制代码代码如下所示:
如果(myobj时= = null){

VaR myobj时= { };

}

然而,虽然结果是正确的,它是语义错误的,是应该避免的,因为空是一个空的对象被分配一个值为零,即对象实际上是值,定义指不存在或不分对象,因此,它只能使用比较运算符(= =),如果我们使用精确比较运算符(=),会出错。

写作的第九种方式
你也可以使用在操作符来判断myobj时是前对象的属性:
复制代码代码如下所示:
如果(!('myobj'in窗口)){

window.myobj = { };

}

写作的第十种方式
最后,该hasownproperty方法用来确定myobj时是前对象的属性:
复制代码代码如下所示:
如果(!this.hasownproperty('myobj ')){

this.myobj = { };

}

总结
1。如果判断对象是存在的,建议使用第五种写作方式。

2。如果对象存在与否,有必要判断对象是否具有空值,建议使用第一种方法。

三.除了特殊情况外,所有变量都应该用var命令声明。

4。为了跨平台,建议避免使用窗口来表示顶层对象。

5。在Javascript语言中,null和未定义很容易混淆。