各个措施决断Javascript对象是或不是存在

2019-08-02 08:57栏目:WRB前端

Javascript语言的规划非常不够严刻,相当多地点一十分大心就能够出错。
比方来讲来讲,请思虑以下情况。
现行反革命,大家要认清八个大局对象myObj是不是留存,若是空头支票,就对它进行宣示。用自然语言描述的算法如下:

Javascript语言的规划远远不够严刻,非常多地点一比非常的大心就能出错。
举例来讲,请思念以下情况。
今昔,大家要认清叁个大局对象myObj是还是不是留存,要是不设有,就对它实行宣示。用自然语言描述的算法如下:

复制代码 代码如下:

复制代码 代码如下:

if (myObj不存在){
    声明myObj;
  }

if (myObj不存在){

您大概会以为,写出这段代码很轻松。不过实际,它事关的语法难题,远比大家想像的头昏眼花。Juriy Zaytsev提议,决断七个Javascript对象是不是留存,有赶过50种写法。唯有对Javascript语言的贯彻细节非常通晓,才大概分得清它们的区分。

    声明myObj;

率先种写法
依据直觉,你只怕认为能够如此写:

  }

复制代码 代码如下:

您恐怕会感觉,写出这段代码很轻巧。不过实际,它涉及的语法难题,远比大家想像的繁杂。Juriy Zaytsev提议,决断贰个Javascript对象是或不是留存,有越过50种写法。唯有对Javascript语言的贯彻细节极度清楚,才或者分得清它们的区分。

if (!myObj) {
    myObj = { };
  }

率先种写法 依据直觉,你只怕认为能够这么写:

唯独,运营这段代码,浏览器会一贯抛出ReferenceError错误,导致运转中断。请问错在哪个地方?
对了,if语句决断myObj是不是为空时,这几个变量还海市蜃楼,所以才会报错。改成下边那样,就能够科学生运动营了。

复制代码 代码如下:

复制代码 代码如下:

if (!myObj) {

if (!myObj) {
    var myObj = { };
  }

    myObj = { };

为何加了三个var今后,就不报错了?难道这种气象下,if语句做剖断期,myObj就已经存在了吗?
要应对这些难题,就非得知道Javascript解释器的专门的工作措施。Javascript语言是”先深入分析,后运营”,分析时就早就成功了变量注解,所以地点的代码实际等同于:

  }

复制代码 代码如下:

但是,运营这段代码,浏览器会直接抛出ReferenceError错误,导致运维中断。请问错在哪儿?
对了,if语句判定myObj是不是为空时,这么些变量还空头支票,所以才会报错。改成上面这样,就能够科学运行了。

var myObj;
  if (!myObj) {
    var myObj = { };
  }

复制代码 代码如下:

所以,if语句做判按期,myObj确实已经存在了,所以就不报错了。那就是var命令的”代码升高”(hoisting)效用。Javascript解释器,只”进步”var命令定义的变量,对不行使var命令、直接赋值的变量不起功用,那正是为啥不加var会报错的来由。

if (!myObj) {

其次种写法
除此之外var命令,还足以有另一种改写,也能获取不错的结果:

    var myObj = { };

复制代码 代码如下:

  }

if (!window.myObj) {
    myObj = { };
  }

干什么加了八个var未来,就不报错了?难道这种气象下,if语句做判别期,myObj就曾经存在了吗?
要应对这些难点,就亟须明白Javascript解释器的工作办法。Javascript语言是"先解析,后运行",剖析时就早已到位了变量注脚,所以位置的代码实际等同于:

window是javascript的顶层对象,全数的全局变量都以它的性能。所以,判定myobj是不是为空,等同于剖断window对象是否有myobj属性,那样就能够制止因为myObj没有概念而出现ReferenceError错误。但是,从代码的标准性考虑,最佳依然对第二行加上var:

复制代码 代码如下:

复制代码 代码如下:

var myObj;

if (!window.myObj) {
    var myObj = { };
  }

  if (!myObj) {

要么写成这么:

    var myObj = { };

复制代码 代码如下:

  }

if (!window.myObj) {
    window.myObj = { };
  }

由此,if语句做剖断时,myObj确实已经存在了,所以就不报错了。这就是var命令的"代码进步"(hoisting)效率。Javascript解释器,只"升高"var命令定义的变量,对不选取var命令、直接赋值的变量不起作用,那正是为啥不加var会报错的来头。

其二种写法
下面这种写法的弱项在于,在有个别运营条件中(举个例子V8、Rhino),window未必是顶层对象。所以,思索改写成:

其次种写法 除此之外var命令,还是能有另一种改写,也能赢得不错的结果:

复制代码 代码如下:

复制代码 代码如下:

if (!this.myObj) {
    this.myObj = { };
  }

if (!window.myObj) {

在全局变量的局面中,this关键字总是指向顶层变量,所以就足以独立于不一致的运作情状。

    myObj = { };

第八种写法
不过,上边那样写可读性比较差,何况this的指向是可变的,轻松失误,所以尤其改写:

  }

复制代码 代码如下:

window是javascript的顶层对象,全部的全局变量都是它的习性。所以,推断myobj是还是不是为空,等同于决断window对象是还是不是有myobj属性,那样就足以幸免因为myObj未有定义而出现ReferenceError错误。可是,从代码的标准性思考,最佳依然对第二行加上var:

var global = this;
  if (!global.myObj) {
    global.myObj = { };
  }

复制代码 代码如下:

用自定义变量global表示顶层对象,就清楚多了。

    if (!window.myObj) {

第种种写法
还足以应用typeof运算符,推断myObj是或不是有定义。

        var myObj = { };

复制代码 代码如下:

      }

if (typeof myObj == "undefined") {
    var myObj = { };
  }

  或许写成那样:

那是这段时间采用最广泛的判别javascript对象是还是不是留存的方式。

      if (!window.myObj) {

第四种写法
鉴于在已定义、但未赋值的景况下,myObj的值直接等于undefined,所以地点的写法能够简化:

        window.myObj = { };

复制代码 代码如下:

      }

if (myObj == undefined) {
    var myObj = { };
  }

其二种写法 地点这种写法的弱点在于,在好几运营遇到中(举例V8、Rhino),window未必是顶层对象。所以,考虑改写成:

那边有五个地点必要留意,首先第二行的var关键字无法少,不然会产出ReferenceError错误,其次undefined不能够加单引号或双引号,因为此处相比较的是undefined这种数据类型,并不是”undefined”那么些字符串。

复制代码 代码如下:

第各样写法
地点的写法在”正确比较”(===)的情形下,依旧创建:

if (!this.myObj) {

复制代码 代码如下:

    this.myObj = { };

if (myObj === undefined) {
    var myObj = { };
  }

  }

第各种写法
基于javascript的语言设计,undefined == null,所以相比较myObj是不是等于null,也能赢得准确结果:

在全局变量的局面中,this关键字总是指向顶层变量,所以就足以独立于不一致的运作碰到。

复制代码 代码如下:

第多样写法 而是,上面这样写可读性很糟糕,况兼this的对准是可变的,轻巧失误,所以进一步改写:

if (myObj == null) {
    var myObj = { };
  }

复制代码 代码如下:

只是,固然运营结果精确,然而从语义上看,这种论断格局是错的,应该幸免。因为null指的是已经赋值为null的空对象,即这一个目的实际是有值的,而undefined指的是空中楼阁或尚未赋值的靶子。因而,这里不得不动用”比较运算符”(==),若是这里运用”正确比较运算符”(===),就可以出错。

var global = this;

第九种写法
还是可以动用in运算符,决断myObj是或不是为顶层对象的贰特品质:

  if (!global.myObj) {

复制代码 代码如下:

    global.myObj = { };

if (!('myObj' in window)) {
    window.myObj = { };
  }

  }

第十种写法
末尾,使用hasOwnProperty方法,判断myObj是不是为顶层对象的壹天性能:

用自定义变量global表示顶层对象,就通晓多了。

复制代码 代码如下:

第四种写法 还足以选用typeof运算符,推断myObj是还是不是有定义。

if (!this.hasOwnProperty('myObj')) {
    this.myObj = { };
  }

复制代码 代码如下:

总结

if (typeof myObj == "undefined") {

  1. 就算只看清指标是否存在,推荐使用第各类写法。
    2. 假使除去对象是否存在,还要推断目的是或不是有null值,推荐应用第一种写法。
  2. 惟有极度景况,全体变量都应该运用var命令申明。
  3. 为了跨平台,建议防止使用window表示顶层对象。
    5. 在Javascript语言中,null和undefined轻松产生模糊。在大概同有的时候候涉嫌相互的图景下,提出选取”精确相比”运算符(===)。

    var myObj = { };

你只怕感兴趣的小说:

  • 推断JS对象是不是持有某属性的格局推荐
  • JavaScript决断指标是还是不是为数组
  • JS/Jquery判定指标为空的主意
  • Javascript中判别指标是否为空
  • 简轻易单方法判断JavaScript对象为null恐怕性质为空
  • JavaScript判别变量是目的照旧数组的法子
  • js语艺术学习之判别四个对象是否为数组
  • js中推断指标是不是为空的二种完成格局
  • 认清JS对象是或不是持有某种属性的三种情势
  • js达成数组去重、决断数组以及对象中的内容是还是不是一律
  • 怎么样决断Javascript对象是或不是留存的粗略实例

  }

那是如今利用最分布的判断javascript对象是还是不是存在的不二秘诀。

第两种写法 鉴于在已定义、但未赋值的情况下,myObj的值直接等于undefined,所以地点的写法能够简化:

复制代码 代码如下:

if (myObj == undefined) {

    var myObj = { };

  }

那边有多个地方须求小心,首先第二行的var关键字不可能少,不然会冒出ReferenceError错误,其次undefined不可能加单引号或双引号,因为这里比较的是undefined这种数据类型,实际不是"undefined"这些字符串。

第三种写法 下边包车型地铁写法在"准确相比"(===)的情事下,依旧创设:

复制代码 代码如下:

if (myObj === undefined) {

    var myObj = { };

  }

第各个写法 基于javascript的语言设计,undefined == null,所以比较myObj是或不是等于null,也能博得不错结果:

复制代码 代码如下:

if (myObj == null) {

    var myObj = { };

  }

唯独,固然运营结果准确,然而从语义上看,这种决断方法是错的,应该防止。因为null指的是一度赋值为null的空对象,即这一个目的实际是有值的,而undefined指的是不设有或尚未赋值的对象。由此,这里只好选取"相比运算符"(==),假诺这里运用"准确比较运算符"(===),就能够出错。

第九种写法 还足以应用in运算符,推断myObj是或不是为顶层对象的一个属性:

复制代码 代码如下:

if (!('myObj' in window)) {

    window.myObj = { };

  }

第十种写法 提起底,使用hasOwnProperty方法,决断myObj是不是为顶层对象的一个性子:

复制代码 代码如下:

if (!this.hasOwnProperty('myObj')) {

    this.myObj = { };

  }

总结 1. 万一只决断指标是否存在,推荐使用第各类写法。

  1. 若果除去对象是否存在,还要推断目的是否有null值,推荐应用第一种写法。

  2. 只有格外意况,全体变量都应该运用var命令注明。

  3. 为了跨平台,提出制止使用window表示顶层对象。

5. 在Javascript语言中,null和undefined轻便爆发模糊。在恐怕同一时间涉嫌互相的状态下,提出选用"精确相比较"运算符(===)。

你可能感兴趣的小说:

  • Javascript推断目标是否等于实当代码
  • js中剖断Object、Array、Function等引用类型对象是还是不是等于
  • js中推断指标是不是为空的二种完结方式
  • JavaScript 判定推断有些对象是Object照旧贰个Array
  • javascript检查评定对象中是还是不是留存某些属性剖断格局小结
  • Javascript中判别变量是数组如故对象(array照旧object)
  • JS/Jquery判定指标为空的法门
  • 轻松易行方法判定JavaScript对象为null大概性质为空
  • JS判定浏览器之Navigator对象
  • js推断目的是不是是某一品种
  • JavaScript中判断指标类型的二种办法计算
  • js落成数组去重、推断数组以及对象中的内容是还是不是一样
  • JS剖断四个目的内容是或不是等于的格局身体力行

版权声明:本文由威尼斯人app发布于WRB前端,转载请注明出处:各个措施决断Javascript对象是或不是存在