亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JS判斷對象是否存在的10種方法總結

2019-11-20 21:24:34
字體:
來源:轉載
供稿:網友

Javascript語言的設計不夠嚴謹,很多地方一不小心就會出錯。
舉例來說,請考慮以下情況。
現在,我們要判斷一個全局對象myObj是否存在,如果不存在,就對它進行聲明。用自然語言描述的算法如下:

復制代碼 代碼如下:

if (myObj不存在){

    聲明myObj;

  }

你可能會覺得,寫出這段代碼很容易。但是實際上,它涉及的語法問題,遠比我們想象的復雜。Juriy Zaytsev指出,判斷一個Javascript對象是否存在,有超過50種寫法。只有對Javascript語言的實現細節非常清楚,才可能分得清它們的區別。

第一種寫法
根據直覺,你可能覺得可以這樣寫:

復制代碼 代碼如下:

if (!myObj) {

    myObj = { };

  }

但是,運行這段代碼,瀏覽器會直接拋出ReferenceError錯誤,導致運行中斷。請問錯在哪里?
對了,if語句判斷myObj是否為空時,這個變量還不存在,所以才會報錯。改成下面這樣,就能正確運行了。
復制代碼 代碼如下:

if (!myObj) {

    var myObj = { };

  }

為什么加了一個var以后,就不報錯了?難道這種情況下,if語句做判斷時,myObj就已經存在了嗎?
要回答這個問題,就必須知道Javascript解釋器的工作方式。Javascript語言是"先解析,后運行",解析時就已經完成了變量聲明,所以上面的代碼實際等同于:
復制代碼 代碼如下:

var myObj;

  if (!myObj) {

    var myObj = { };

  }

因此,if語句做判斷時,myObj確實已經存在了,所以就不報錯了。這就是var命令的"代碼提升"(hoisting)作用。Javascript解釋器,只"提升"var命令定義的變量,對不使用var命令、直接賦值的變量不起作用,這就是為什么不加var會報錯的原因。

第二種寫法
除了var命令,還可以有另一種改寫,也能得到正確的結果:

復制代碼 代碼如下:

if (!window.myObj) {

    myObj = { };

  }

window是javascript的頂層對象,所有的全局變量都是它的屬性。所以,判斷myobj是否為空,等同于判斷window對象是否有myobj屬性,這樣就可以避免因為myObj沒有定義而出現ReferenceError錯誤。不過,從代碼的規范性考慮,最好還是對第二行加上var:
復制代碼 代碼如下:

    if (!window.myObj) {

        var myObj = { };

      }

  或者寫成這樣:

      if (!window.myObj) {

        window.myObj = { };

      }

第三種寫法
上面這種寫法的缺點在于,在某些運行環境中(比如V8、Rhino),window未必是頂層對象。所以,考慮改寫成:
復制代碼 代碼如下:

if (!this.myObj) {

    this.myObj = { };

  }

在全局變量的層面中,this關鍵字總是指向頂層變量,所以就可以獨立于不同的運行環境。

第四種寫法
但是,上面這樣寫可讀性較差,而且this的指向是可變的,容易出錯,所以進一步改寫:
復制代碼 代碼如下:

var global = this;

  if (!global.myObj) {

    global.myObj = { };

  }

用自定義變量global表示頂層對象,就清楚多了。

第五種寫法
還可以使用typeof運算符,判斷myObj是否有定義。

復制代碼 代碼如下:

if (typeof myObj == "undefined") {

    var myObj = { };

  }

這是目前使用最廣泛的判斷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. 如果只判斷對象是否存在,推薦使用第五種寫法。

2. 如果除了對象是否存在,還要判斷對象是否有null值,推薦使用第一種寫法。

3. 除非特殊情況,所有變量都應該使用var命令聲明。

4. 為了跨平臺,建議避免使用window表示頂層對象。

5. 在Javascript語言中,null和undefined容易產生混淆。在可能同時涉及兩者的情況下,建議使用"精確比較"運算符(===)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品都在这里| 欧美日本高清视频| 热久久免费国产视频| 伊人成人开心激情综合网| 欧美性高潮在线| 色偷偷av一区二区三区乱| 亚洲视频网站在线观看| 一本大道亚洲视频| 欧美激情精品久久久久久久变态| 亚洲第一黄色网| 欧洲精品毛片网站| 亚洲国产精品免费| 精品电影在线观看| 亚洲成人黄色网址| 亚洲成人动漫在线播放| 久久久久久久一区二区| 青青草精品毛片| 欧美韩日一区二区| 91免费看片网站| 久久福利视频导航| 欧美高清在线视频观看不卡| 亚洲乱码国产乱码精品精| 精品美女久久久久久免费| 国产精品免费看久久久香蕉| 国产一区二中文字幕在线看| 久久免费成人精品视频| 日韩av网站大全| 国产精品视频xxx| 日韩av免费网站| 国产网站欧美日韩免费精品在线观看| 伊人久久大香线蕉av一区二区| 97香蕉超级碰碰久久免费的优势| 精品国产91久久久| 亚洲精品少妇网址| 亚洲欧美国产高清va在线播| 77777少妇光屁股久久一区| 国产精品美女午夜av| 久久精品成人欧美大片| 色偷偷888欧美精品久久久| 欧美日韩一区二区在线| 欧美又大粗又爽又黄大片视频| 国产视频精品va久久久久久| 久久久久久久亚洲精品| 在线丨暗呦小u女国产精品| 九九精品视频在线| 不卡毛片在线看| 姬川优奈aav一区二区| 精品久久久中文| 亚洲国产精品va在看黑人| 欧美极度另类性三渗透| 欧美性猛交xxxx偷拍洗澡| 国产午夜精品免费一区二区三区| 日本一区二区在线播放| 久久精品成人一区二区三区| 欧美国产在线电影| 久久久久久com| 亚洲情综合五月天| 久久久精品一区二区三区| 成人妇女淫片aaaa视频| 91av在线不卡| 日韩av电影院| 韩剧1988在线观看免费完整版| 国产精品丝袜久久久久久高清| 91午夜理伦私人影院| 欧美成人久久久| 亚洲国产精品人久久电影| 国内精品国产三级国产在线专| 成人激情春色网| 97人洗澡人人免费公开视频碰碰碰| 亚洲电影免费观看高清| 在线观看免费高清视频97| 亚洲精品国产品国语在线| 欧美一级视频免费在线观看| 亚洲欧洲一区二区三区久久| 日韩在线小视频| 精品国产一区二区三区久久狼黑人| 高清视频欧美一级| 精品国产31久久久久久| 中文字幕精品av| 亚洲免费视频在线观看| 亚洲第一av网站| 中文字幕日韩av综合精品| 欧美精品成人91久久久久久久| 国产日韩在线精品av| 美女福利视频一区| 亚洲日韩中文字幕在线播放| 亚洲第一精品夜夜躁人人躁| 国产精品劲爆视频| 5252色成人免费视频| 97久久精品人人澡人人爽缅北| 亚洲缚视频在线观看| 正在播放欧美一区| 欧美国产中文字幕| 亚洲男人天堂手机在线| 精品精品国产国产自在线| 欧美福利在线观看| 欧美一区二区三区图| 欧美日韩亚洲视频| 国产精品黄色影片导航在线观看| 国产精品一区二区三区毛片淫片| 亚洲色图综合久久| 国产精品白嫩美女在线观看| 2018中文字幕一区二区三区| 97视频在线观看免费高清完整版在线观看| 国产一区二区三区直播精品电影| 国产精品免费电影| 91av视频在线播放| 97视频在线观看网址| 欧美激情一区二区三区高清视频| 不卡毛片在线看| 精品久久久久久国产91| xx视频.9999.com| 免费不卡欧美自拍视频| 亚洲国产日韩欧美在线99| 欧美日韩国产成人在线| 中文字幕亚洲欧美日韩2019| 亚洲视频网站在线观看| 97成人在线视频| 97免费视频在线播放| 欧美午夜宅男影院在线观看| 精品久久久久久国产| 精品欧美国产一区二区三区| 粉嫩av一区二区三区免费野| 亚洲一区二区久久久久久| 亚洲欧美视频在线| 久久久久久久激情视频| 欧美精品久久久久| 97在线精品视频| 欧美理论片在线观看| 97av在线影院| 在线成人中文字幕| 日韩精品有码在线观看| 97精品一区二区三区| 久久久国产精品免费| 国产精品自拍视频| 久久人人97超碰精品888| 亚洲人成网站777色婷婷| 91啪国产在线| 色妞一区二区三区| 欧美精品aaa| 欧美日韩在线视频一区| 亚洲情综合五月天| 国产精品久久久久久久久久新婚| 国产拍精品一二三| 最近中文字幕2019免费| 精品国产老师黑色丝袜高跟鞋| 国产精品香蕉国产| 中文字幕成人精品久久不卡| 国产成人久久精品| 久久免费视频在线| 欧美精品久久久久| 成人网在线免费观看| 色婷婷亚洲mv天堂mv在影片| 国产精品久久久亚洲| 国产精品嫩草影院久久久| 亚洲色图第三页| 欧美性视频在线| 欧美高清性猛交| 国产91久久婷婷一区二区| 欧美又大又粗又长| 日韩美女在线观看| 欧美视频中文在线看| 亚洲天堂第二页| 亚洲精选在线观看|