js 判断节点是否存在 一个简单的例子说明如何判断一个Javascript对象是否存在

一个简单的例子说明如何判断一个Javascript对象是否存在

下面小编就给大家带来一个简单的例子来说明如何判断一个Javascript对象是否存在。 小编觉得还不错,所以现在就分享给大家,供大家参考。下面就跟着小编一起来看看吧。

Javascript是一种原型继承的基于对象的动态类型区分大小写的客户端脚本语言,从Netscape的LiveScript发展而来。 主要目的是解决 Perl 等服务器端语言留下的速度问题,为客户提供更流畅的浏览效果。

Javascript语言的设计不够严谨,一不小心就会在很多地方出现错误。

例如,考虑以下情况。

现在,我们需要确定全局对象 myObj 是否存在。 如果不存在,则声明它。 用自然语言描述的算法如下:

  1.  
  2. if (myObj不存在){
  3. 声明myObj;
  4. }

您可能认为编写这段代码很容易。 但事实上,其中涉及的语法问题远比我们想象的复杂。 Juriy Zaytsev 指出,有超过 50 种方法可以确定 Javascript 对象是否存在。 只有非常清楚Javascript语言的实现细节,才能区分它们之间的区别。

第一种写法

根据直觉,您可能会认为可以这样写:

  1.  
  2. if (!myObj) {
  3. myObj = { };
  4. }

判断节点是什么_js 判断节点是否存在_准确判断是否是节点对象

但是,运行这段代码时,浏览器会直接抛出ReferenceError错误js 判断节点是否存在,导致运行中断。 怎么了?

顺便说一句,if语句判断myObj是否为空时,这个变量还不存在,所以报错。 改成下面的就可以正确运行了。

  1.  
  2. if (!myObj) {
  3. var myObj = { };
  4. }

为什么添加var后没有报错? 难道这样的话,if语句判断的时候myObj就已经存在了?

要回答这个问题,你必须知道Javascript解释器是如何工作的。 Javascript 语言是“先解析,后运行”。 解析时变量声明已经完成,所以上面的代码实际上等价于:

  1.  
  2. var myObj;
  3. if (!myObj) {
  4. var myObj = { };
  5. }

因此,if语句进行判断时,myObj确实已经存在,所以不会报错。 这就是var命令的“提升”效果。 Javascript 解释器仅“提升”由 var 命令定义的变量。 它不适用于不使用 var 命令直接赋值的变量。 这就是为什么不加var会报错的原因。

第二种写法

除了var命令之外,还有一个修改也能得到正确的结果:

  1.  
  2. if (!window.myObj) {
  3. myObj = { };
  4. }

Window是JavaScript的顶层对象,所有的全局变量都是它的属性。 因此,判断myobj是否为空就相当于判断window对象是否有myobj属性,这样就可以避免因为myObj未定义而出现的ReferenceError错误。 不过从代码的规范性来说,最好在第二行加上var:

  1.  
  2. if (!window.myObj) {
  3. var myObj = { };
  4. }

或者这样写:

  1.  
  2. if (!window.myObj) {
  3. window.myObj = { };
  4. }

第三种写法

上述写法的缺点是,在某些运行环境(如V8、Rhino)中,window可能不是顶级对象。 因此,考虑将其重写为:

  1.  
  2. if (!this.myObj) {
  3. this.myObj = { };
  4. }

在全局变量层面,this关键字始终指向顶层变量,因此可以独立于不同的运行环境。

第四种写法

但是上面的写法可读性较差,而且this的指针是可变的,容易出错,所以我们进一步重写:

  1.  
  2. var global = this;
  3. if (!global.myObj) {
  4. global.myObj = { };
  5. }

使用自定义变量global来表示顶层对象就清晰多了。

第五种写法

您还可以使用 typeof 运算符来确定 myObj 是否已定义。

  1.  
  2. if (typeof myObj == "undefined") {
  3. var myObj = { };
  4. }

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

第六种写法

由于myObj的值在定义但未赋值时直接等于undefinedjs 判断节点是否存在,所以上面的写法可以简化:

  1.  
  2. if (myObj == undefined) {
  3. var myObj = { };
  4. }

这里有两件事需要注意。 首先,第二行的var关键字不能缺失,否则会出现ReferenceError。 其次,undefine不能加单引号或者双引号,因为这里比较的是undefine的数据类型,而不是“undefined”这个字符串。

判断节点是什么_准确判断是否是节点对象_js 判断节点是否存在

第七种写法

上述写法在“精确比较”(===)的情况下仍然成立:

  1.  
  2. if (myObj === undefined) {
  3. var myObj = { };
  4. }

第八种写法

根据JavaScript的语言设计,undefined == null,所以比较myObj是否等于null也能得到正确的结果:

  1.  
  2. if (myObj == null) {
  3. var myObj = { };
  4. }

然而,虽然运行结果是正确的,但从语义角度来看,这种判断方法是错误的,应该避免。 因为null指的是一个已经被赋值为null的空对象,即这个对象实际上是有值的,而undefined指的是一个不存在或者没有赋值的对象。 因此,这里只能使用“比较运算符”(==)。 如果这里使用“精确比较运算符”(===),就会出现错误。

第九种写法

您还可以使用 in 运算符来确定 myObj 是否是顶级对象的属性:

  1.  
  2. if (!('myObj' in window)) {
  3. window.myObj = { };
  4. }

准确判断是否是节点对象_判断节点是什么_js 判断节点是否存在

第十种写法

最后,使用 hasOwnProperty 方法判断 myObj 是否是顶级对象的属性:

  1.  
  2. if (!this.hasOwnProperty('myObj')) {
  3. this.myObj = { };
  4. }

总结

1、如果只是判断对象是否存在,建议使用第五种写法。

2.如果除了判断对象是否存在之外,还需要判断对象是否有空值,建议使用第一种写法。

3、除非有特殊情况,所有变量都应该使用var命令来声明。

4. 为了跨平台目的,建议避免使用window来表示顶级对象。

5.在Javascript语言中,null和undefined很容易混淆。 如果两者都涉及,建议使用“精确比较”运算符(===)。

(超过)

上面简单的例子如何判断一个Javascript对象是否存在,就是编辑器分享的全部内容。 希望能给大家一个参考,也希望大家多多支持phperz。

© 版权声明
THE END
喜欢就支持一下吧
点赞135赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容