确定Javascript对象是否存在的各种方法
Javascript语言的设计不够严谨,很多地方在不小心的时候会出错。例如,请考虑以下内容。
现在,我们要判断一个全局对象myobj时存在的,如果它不存在,我们将宣布它。在自然语言描述的算法如下:
复制代码代码如下所示:
如果(myobj时不存在){
申报myobj时;
}
你可能会认为写这个代码很简单,但实际上,它涉及的是比我们想象的更复杂的语法问题。Juriy Zaytsev指出,有超过50的方法来判断一个对象是否存在。只有对Javascript脚本语言实现的细节都很清楚,所以他们可以区分。
第一种写作方法
根据直觉,你可能认为它可以这样写:
复制代码代码如下所示:
如果(!MyObj){
myobj时= { };
}
然而,运行此代码,浏览器会把referenceerror误差直接导致中断运行。错误在哪里,好吗
顺便说一句,if语句判断myobj时是空的,这个变量是不存在的,所以说是错误的,改成下面这样可以正确运行。
复制代码代码如下所示:
如果(!MyObj){
VaR myobj时= { };
}
为什么不在添加var后犯错误呢在这种情况下,当if语句判断,是myobj时已经存在的吗
要回答这个问题,您必须知道Javascript解释器是如何工作的。首先对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和未定义是很容易混淆的。在可能也涉及两种情况下,推荐使用精确比较运算符(= =)。