精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

比較 JavaScript 對象的四種方式

開發(fā) 前端
比較 JavaScript 中的值非常簡單,只需用相等運算符即可,但是對象卻有結(jié)構(gòu)化的數(shù)據(jù),所以比較起來比較困難。在本文中,你將學(xué)習(xí)如何正確比較 JavaScript 中的對象。

 前言

[[329882]]

比較 JavaScript 中的值非常簡單,只需用相等運算符即可,例如嚴(yán)格相等運算符:

 

  1. 'a' === 'c'; // => false 
  2. 1   === 1;   // => true 

但是對象卻有結(jié)構(gòu)化的數(shù)據(jù),所以比較起來比較困難。在本文中,你將學(xué)習(xí)如何正確比較 JavaScript 中的對象。

1. 引用比較

JavaScript 提供了 3 種方法來對值進行比較:

  • 嚴(yán)格相等運算符 ===
  • 寬松相等運算符 ==
  • Object.is() 函數(shù)

當(dāng)使用上述任何一種方法比較對象時,只有在比較的值引用了相同的對象實例時,比較的結(jié)果為 true。這就是參照相等性。

讓我們定義對象 hero1 和 hero2 ,并查看實際中的參照相等性:

 

  1. const hero1 = { 
  2.    name'Batman' 
  3.  }; 
  4.  const hero2 = { 
  5.    name'Batman' 
  6.  }; 
  7.   
  8.  hero1 === hero1; // => true 
  9.  hero1 === hero2; // => false 
  10.  
  11. hero1 == hero1; // => true 
  12. hero1 == hero2; // => false 
  13.  
  14. Object.is(hero1, hero1); // => true 
  15. Object.is(hero1, hero2); // => false 

hero1 === hero1 的計算結(jié)果為 true,因為兩個操作數(shù)均指向了同一個對象實例hero1。

另一方面,hero1 === hero2 的計算結(jié)果為 false,因為 hero1 和 hero2 是不同的對象實例。

有意思的是,hero1 和 hero2 對象的內(nèi)容是相同的:兩個對象都有一個 name 屬性,它的其值是 'Batman'。盡管如此,即使比較相同結(jié)構(gòu)的對象,hero1 === hero2 的結(jié)果也是 false。

當(dāng)你想比較對象引用而不是它們的內(nèi)容時,引用相等是很有用的。但是在更多的情況之下,你都想針對對象的實際內(nèi)容進行比較:例如屬性及它們的值。

接下來看看如何通過對象的內(nèi)容比較對象是否相等。

2. 手動比較

按內(nèi)容比較對象最直接的方法是讀取屬性并手動比較它們。

例如,讓我們編寫一個特殊的函數(shù) isHeroEqual() 來比較兩個 hero 對象:

 

  1. function isHeroEqual(object1, object2) { 
  2.    return object1.name === object2.name
  3.  } 
  4.   
  5.  const hero1 = { 
  6.    name'Batman' 
  7.  }; 
  8.  const hero2 = { 
  9.    name'Batman' 
  10. }; 
  11. const hero3 = { 
  12.   name'Joker' 
  13. }; 
  14.  
  15. isHeroEqual(hero1, hero2); // => true 
  16. isHeroEqual(hero1, hero3); // => false 

isHeroEqual() 訪問兩個對象的屬性 name 并比較它們的值。

如果被比較的對象具有一些屬性,我更喜歡編寫諸如 isHeroEqual() 之類的比較函數(shù)。這類函數(shù)具有良好的性能:在比較中只會涉及少數(shù)幾個屬性訪問器和相等運算符。

手動比較需要手動提取屬性,對于簡單對象來說,這不是問題。但是,要對較大的對象(或結(jié)構(gòu)未知的對象)進行比較,就不方便了,因為它需要大量的樣板代碼。

那么讓我們來看看對象的淺層比較能提供哪些幫助。

3. 淺層比較

如果用淺層比較檢查對象,你必須獲取兩個對象的屬性列表(使用Object.keys()),然后檢查它們的屬性值是否相等。

下面的代碼是淺層比較的一種實現(xiàn)方式:

 

  1.  function shallowEqual(object1, object2) { 
  2.    const keys1 = Object.keys(object1); 
  3.    const keys2 = Object.keys(object2); 
  4.   
  5.    if (keys1.length !== keys2.length) { 
  6.      return false
  7.    } 
  8.   
  9.    for (let index = 0; index < keys1.length; index++) { 
  10.     const val1 = object1[keys1[index]]; 
  11.     const val2 = object2[keys2[index]]; 
  12.     if (val1 !== val2) { 
  13.       return false
  14.     } 
  15.   } 
  16.  
  17.   return true

在函數(shù)內(nèi)部,keys1 和 keys2 是分別包含 object1 和 object2 屬性名稱的數(shù)組。

用 for 循環(huán)遍歷鍵,并比較 object1 和 object2 的每個屬性。

使用淺層比較,你可以輕松對有著許多屬性的對象進行相等性檢查:

 

  1. const hero1 = { 
  2.   name'Batman'
  3.   realName: 'Bruce Wayne' 
  4.  }; 
  5.  const hero2 = { 
  6.    name'Batman'
  7.    realName: 'Bruce Wayne' 
  8.  }; 
  9.  const hero3 = { 
  10.   name'Joker' 
  11. }; 
  12.  
  13. shallowEqual(hero1, hero2); // => true 
  14. shallowEqual(hero1, hero3); // => false 

shallowEqual(hero1, hero2) 返回 true,因為對象 hero1 和 hero2 具有相同的屬性(name 和 realName),并且值也相同。

另一方面,由于 hero1 和 hero3 具有不同的屬性,所以 shallowEqual(hero1, hero3) 將會返回 false。

但是 JavaScript 中的對象是可以嵌套的。在這種情況下,淺層比較并不能很好地發(fā)揮作用。

下面對具有嵌套對象的對象執(zhí)行淺層比較檢查:

 

  1.  const hero1 = { 
  2.   name'Batman'
  3.  address: { 
  4.    city: 'Gotham' 
  5.   } 
  6. }; 
  7. const hero2 = { 
  8.  name'Batman'
  9.   address: { 
  10.     city: 'Gotham' 
  11.   } 
  12. }; 
  13.  
  14. shallowEqual(hero1, hero2); // => false 

這次,即使兩個對象 hero1 和 hero2 具有相同的內(nèi)容,shallowEqual(hero1, hero2) 也將會返回 false。

發(fā)生這種情況是因為嵌套對象 hero1.address 和 hero2.address 是不同的對象實例。因此,淺層比較認(rèn)為 hero1.address 和 hero2.address 是兩個不同的值。

解決嵌套對象的問題需要進行深層比較。

4. 深層比較

深層比較與淺層比較相似,不同之處在于,當(dāng)屬性中包含對象時,將對嵌套對象執(zhí)行遞歸淺層比較。

看一下深層比較的實現(xiàn):

 

  1. function deepEqual(object1, object2) { 
  2.   const keys1 = Object.keys(object1); 
  3.  const keys2 = Object.keys(object2); 
  4.  
  5.    if (keys1.length !== keys2.length) { 
  6.     return false
  7.   } 
  8.   
  9.    for (let index = 0; index < keys1.length; index++) { 
  10.     const val1 = object1[keys1[index]]; 
  11.     const val2 = object2[keys2[index]]; 
  12.     const areObjects = isObject(val1) && isObject(val2); 
  13.     if (areObjects && !deepEqual(val1, val2) ||  
  14.         !areObjects && val1 !== val2) { 
  15.       return false
  16.     } 
  17.   } 
  18.  
  19.   return true
  20.  
  21. function isObject(object) { 
  22.   return object != null && typeof object === 'object'

第 13 行的 areObjects && !deepEqual(val1, val2) 一旦檢查到的屬性是對象,則遞歸調(diào)用將會開始驗證嵌套對象是否也相等。

現(xiàn)在用 deepEquality() 比較具有嵌套對象的對象:

 

  1. const hero1 = { 
  2.    name'Batman'
  3.    address: { 
  4.      city: 'Gotham' 
  5.   } 
  6.  }; 
  7.  const hero2 = { 
  8.   name'Batman'
  9.    address: { 
  10.     city: 'Gotham' 
  11.   } 
  12. }; 
  13.  
  14. deepEqual(hero1, hero2); // => true 

深度比較函數(shù)能夠正確地確定 hero1 和 hero2 是否具有相同的屬性和值,包括嵌套對象 hero1.address 和 hero2.address 的相等性。

為了深入比較對象,我建議使用Node內(nèi)置util模塊的 isDeepStrictEqual(object1, object2)(

https://nodejs.org/api/util.html#

util_util_isdeepstrictequal_val1_val2) 或lodash 庫的_.isEqual(object1, object2)(

https://lodash.com/docs/4.17.15#isEqual) 。

5. 總結(jié)

引用相等性(使用 ===、 == 或 Object.is())用來確定操作數(shù)是否為同一個對象實例。

手動檢查對象是否相等,需要對屬性值進行手動比較。盡管這類檢查需要手動編碼來對屬性進行比較,但由于很簡單,所以這種方法很方便。

當(dāng)被比較的對象有很多屬性或在運行時確定對象的結(jié)構(gòu)時,更好的方法是使用淺層檢查。

如果比較的對象具有嵌套對象,則應(yīng)該進行深度比較檢查。

責(zé)任編輯:華軒 來源: 前端先鋒
相關(guān)推薦

2021-07-14 10:31:15

JavaScript開發(fā) 技巧

2022-03-25 14:47:24

Javascript數(shù)據(jù)類型開發(fā)

2023-05-22 08:03:28

JavaScrip枚舉定義

2013-05-13 09:48:47

網(wǎng)絡(luò)接入接入方法綜合布線

2025-01-21 09:10:00

2009-06-11 17:22:03

操作xml方式Java

2020-08-03 15:41:02

JavaScript開發(fā)技術(shù)

2013-06-14 15:24:57

Android開發(fā)移動開發(fā)數(shù)據(jù)存儲方式

2017-04-17 19:31:03

Android多線程

2010-07-28 13:54:42

Flex數(shù)據(jù)綁定

2013-10-17 09:25:52

2021-12-22 09:34:01

Golagn配置方式

2014-12-25 09:41:15

Android加載方式

2025-01-20 15:50:19

2024-03-20 15:33:12

2021-06-25 08:00:00

物聯(lián)網(wǎng)醫(yī)療技術(shù)

2011-05-20 09:55:26

Oracle連接

2022-10-27 14:18:13

Flowable流程變量

2015-09-06 09:23:23

Android異步更新

2021-12-01 15:40:40

節(jié)日開源剪貼畫
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品福利无圣光在线一区| 3d动漫精品啪啪一区二区竹菊 | 亚洲色图日韩精品| 成人精品电影在线| 久久久久久久免费视频了| 九九精品在线视频| 奇米777第四色| 亚洲天堂导航| 国产精品国产自产拍高清av| 亚洲最大av网| 日本天堂中文字幕| 日本亚洲不卡| 欧美色手机在线观看| 日本特级黄色大片| 黄色片一区二区三区| 丝袜亚洲另类欧美| www.久久撸.com| xxxwww国产| 成人国产一区二区三区精品麻豆| 一区二区三区产品免费精品久久75| 国产伦理一区二区三区| 国产精品免费无遮挡无码永久视频| 欧美国产一级| 亚洲国产精品小视频| 亚洲人视频在线| 国产丝袜视频在线播放| 国产日韩欧美a| 国产精品xxxx| 亚洲一区中文字幕永久在线| 一区二区三区国产盗摄| 久久久999国产| 国产精品久久不卡| 婷婷久久综合九色综合99蜜桃| 亚洲福利国产精品| 亚洲午夜激情| 免费黄网站在线观看| 国产精品一二三在| 国产精品久久激情| 精品国产免费观看| 欧美在线三区| 伊人亚洲福利一区二区三区| 美女伦理水蜜桃4| 黄色成人在线视频| 欧美日韩另类字幕中文| 狠狠噜天天噜日日噜| 成年人在线看| 久久综合久久鬼色| 国产精品一区免费观看| 国产精品无码久久久久成人app| 久久久人人人| 97av在线视频免费播放| 黄色裸体一级片| 亚洲人成伊人成综合图片| 日韩美女在线视频| 日韩av影视大全| 成人毛片免费| 欧美视频一区在线| 人妻少妇被粗大爽9797pw| 爱情岛论坛亚洲品质自拍视频网站| 国产精品二三区| 亚洲国产欧美不卡在线观看| 九九在线视频| www.在线成人| 国产精品一区二区在线观看| 亚洲AV午夜精品| 国产精品自在在线| 成人网在线免费看| 在线黄色av网站| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品精品视频一区二区三区| 日本黄色中文字幕| 奇米一区二区三区| 国产美女直播视频一区| 欧美激情黑白配| aa级大片欧美三级| 777国产偷窥盗摄精品视频| 精品国产免费观看| 另类天堂av| 26uuu另类亚洲欧美日本一| 日韩成人在线免费视频| 91久久亚洲| 97不卡在线视频| 无码人妻黑人中文字幕| 视频一区在线播放| 国产一区二区色| 国产人妖一区二区| 成人毛片在线观看| 国产美女精品在线观看| 少妇av在线播放| 久久网站最新地址| 亚洲v国产v| 一二三四区在线观看| 亚洲午夜电影网| 国产不卡一区二区视频| 涩涩视频网站在线观看| 日本精品一级二级| 在线观看免费视频高清游戏推荐| 成人午夜888| 亚洲黄色片网站| 最新中文字幕av| 午夜久久福利| 欧美在线影院在线视频| 中文字幕人妻一区二区在线视频 | 精品粉嫩超白一线天av| 日本一区二区三区网站| 国产欧美日韩免费观看| 日韩一区在线视频| 日本在线视频免费| 人禽交欧美网站| 亚洲伊人久久大香线蕉av| 天堂av资源在线| 中文字幕高清一区| 欧美黑人在线观看| 亚洲妇女成熟| 欧美日韩精品福利| 亚洲午夜久久久久久久久| 精品视频亚洲| 久久亚洲一区二区三区四区五区高 | 2023国产精华国产精品| 日韩精品在线观看视频| 污污的视频在线免费观看| 国产精品久久久免费| 国产主播精品在线| 成人福利小视频| 中文一区在线播放| 国产一区二区网| 欧美h版在线观看| 中文字幕日韩精品在线| 97视频在线免费观看| 精品一区二区三区四| 视频一区视频二区中文| 成人片在线免费看| 日本中文字幕电影在线观看 | 亚洲资源一区| 欧美在线观看一区二区| 中文字幕免费在线播放| 91不卡在线观看| 国产精品欧美激情| 亚洲av成人无码久久精品老人 | 高清视频一区二区三区| 老司机午夜在线| 在线观看免费成人| 国产又粗又长又爽| 欧美激情第10页| 国产日韩欧美影视| 国产黄在线看| 色婷婷久久一区二区三区麻豆| 麻豆tv在线观看| 66视频精品| 91在线视频九色| 亚洲s色大片| 欧美色综合久久| 性欧美一区二区| 日韩一级大片| 国产精品手机视频| 久久电影网站| 日韩手机在线导航| 久草视频手机在线| 捆绑紧缚一区二区三区视频| 欧美一区二视频在线免费观看| 三妻四妾的电影电视剧在线观看| 亚洲爱爱爱爱爱| 国产中文字幕免费| 高清成人免费视频| 国产精品三级一区二区| 天堂va在线高清一区| 欧美日韩国产成人在线| a毛片在线免费观看| 亚洲精品国产精品乱码不99| 中文写幕一区二区三区免费观成熟| 国产精品成人一区二区不卡| 成人网页在线免费观看| 91在线中文| 精品久久久久久综合日本欧美| 欧美a级片免费看| 黄网站免费久久| 欧美日韩在线免费观看视频| 久久9999免费视频| 欧美激情在线观看视频| 五月天婷婷视频| 日韩欧美极品在线观看| 欧美熟妇一区二区| 日韩成人一级大片| 一区高清视频| 欧美综合社区国产| 欧美成人在线网站| 凸凹人妻人人澡人人添| 日韩欧美高清视频| 日韩一区二区三区四区视频| 国产成人精品亚洲日本在线桃色 | 欧美大波大乳巨大乳| 麻豆91小视频| 黄色成人在线免费观看| 亚洲第一二三区| 欧美一区二区三区……| 国产小视频在线| 在线电影院国产精品| 久久久久久久久久97| 粉嫩蜜臀av国产精品网站| 日本免费一级视频| 国产日韩视频在线| 亚洲最大的免费| 午夜影院在线播放| 日日骚av一区| 人妻少妇精品无码专区| 91高清视频在线| 欧美性猛交xxxxx少妇| 成人av先锋影音| 午夜免费高清视频| 亚洲欧美文学| 亚洲国产精品123| 动漫视频在线一区| 国产精品人人做人人爽| 青春草免费在线视频| 亚洲性视频网址| 黄色片一区二区三区| 欧美日韩日本视频| www日韩精品| 最新热久久免费视频| 国产在线观看无码免费视频| 麻豆国产欧美日韩综合精品二区 | 日韩欧美亚洲成人| 三级av在线免费观看| 91麻豆文化传媒在线观看| 日本老熟妇毛茸茸| 亚洲黄色在线| 亚洲国产精品综合| 日韩高清三区| 国产成人精品一区二区三区福利 | 日本免费在线精品| 牛牛电影国产一区二区| 日韩一级黄色av| 国产无套粉嫩白浆在线2022年| 欧美一区二区三区电影| 欧美性受xxx黑人xyx性爽| 亚洲成av人影院| 中日韩一级黄色片| 国产无人区一区二区三区| 国产精品亚洲无码| 91美女在线观看| 18禁裸乳无遮挡啪啪无码免费| 99在线精品免费| www.88av| 久久精品一区四区| 久久婷婷五月综合| 中文在线一区二区| 三上悠亚作品在线观看| 亚洲日穴在线视频| 懂色av懂色av粉嫩av| 一区二区三区欧美亚洲| 久久黄色小视频| 亚洲成人自拍偷拍| 日本三级一区二区| 在线观看亚洲精品视频| 久久精品国产亚洲av麻豆蜜芽| 欧美无砖专区一中文字| 亚洲特级黄色片| 欧美一区二区三区在线| а√中文在线资源库| 亚洲成人在线网| 免费在线稳定资源站| 中文字幕亚洲第一| av在线下载| 国模极品一区二区三区| 永久免费毛片在线播放| 国产精品久久久久久久久久免费 | 五月天精品在线| 中文字幕在线不卡一区二区三区| 91精品一区二区三区蜜桃| 亚洲一区二区在线视频| 国产精品久久久免费视频| 欧美怡红院视频| 国产伦一区二区| 亚洲国产精品va在线看黑人| 日本免费不卡| www.欧美三级电影.com| 欧美日韩在线视频免费观看| 欧美洲成人男女午夜视频| 99久久伊人| av成人午夜| 国产成人精品三级高清久久91| 一区国产精品| av成人天堂| 久久久精品高清| av在线综合网| 农村老熟妇乱子伦视频| 亚洲午夜视频在线| 99久久久无码国产精品免费蜜柚| 91精品国产全国免费观看| 无码国精品一区二区免费蜜桃 | 婷婷av在线| 日本电影亚洲天堂| 日韩欧美另类中文字幕| 欧美日韩在线高清| 欧美精品一级| 欧美性猛交xxx乱久交| 成人网页在线观看| 免费成人深夜天涯网站| 性做久久久久久久免费看| 在线观看毛片网站| 日韩av在线网站| 五月天激情在线| 国产精品久久久久久久久免费 | 激情欧美一区二区| 中文字幕丰满乱子伦无码专区| 亚洲免费观看高清完整版在线 | 秋霞在线观看一区二区三区| 欧美1区2区| 成年网站在线播放| 91玉足脚交白嫩脚丫在线播放| www日韩在线| 欧洲精品中文字幕| 性xxxxbbbb| 欧美激情videos| 欧美电影院免费观看| 在线播放豆国产99亚洲| 视频在线在亚洲| 538国产视频| 亚洲综合色丁香婷婷六月图片| 在线播放亚洲精品| 国产午夜精品久久久| 精品一性一色一乱农村| 成人亚洲欧美一区二区三区| 欧美日韩在线网站| 国产偷人视频免费| 99久久er热在这里只有精品66| 激情小说中文字幕| 欧美一区二区三区视频在线观看 | 亚洲成aⅴ人片久久青草影院| 黄网站色视频免费观看 | 午夜男人的天堂| 亚洲最大色网站| jizz中国少妇| 久久精品夜夜夜夜夜久久| 久久精品黄色| 亚洲精品9999| 免费成人美女在线观看| 欧美人妻一区二区三区| 在线影院国内精品| 国产香蕉在线| 国产精品久久电影观看| 久久国产影院| 午夜久久福利视频| 中文字幕亚洲成人| 国产伦精品一区二区三区四区| 自拍偷拍亚洲精品| 国产95亚洲| 99视频精品全部免费看| 国产成人综合在线播放| 免费视频一二三区| 精品国产免费一区二区三区香蕉 | 国产mv久久久| av一区二区高清| 亚洲这里只有精品| 日韩美女视频19| wwwav在线播放| 国内精品国产三级国产在线专| 精品女人视频| 日韩精品一区二区三区不卡| 欧美国产日韩亚洲一区| 一区二区三区午夜| 美乳少妇欧美精品| 给我免费播放日韩视频| 日韩精品一区二区三区久久| 久久精品夜色噜噜亚洲a∨| 亚洲精品国产精品乱码视色| 日韩中文在线中文网三级| 日本在线视频一区二区三区| 久久久久久人妻一区二区三区| 91论坛在线播放| 中文字幕精品一区二| 久久国产精品99国产精| 久久国产精品免费精品3p| 热久久精品国产| 亚洲欧洲三级电影| 欧美在线 | 亚洲| 国产福利视频一区| 91欧美大片| 国产一级免费片| 欧美系列在线观看| 性欧美1819sex性高清大胸| 久久99精品久久久久久久青青日本 | 97人妻人人澡人人爽人人精品| 欧美激情图片区| 精品一区二区三区中文字幕老牛| 五月天激情播播| 欧美性xxxx18| 污污片在线免费视频| 欧美色欧美亚洲另类七区| 国产一区二区调教| 伊人手机在线视频| 久久夜精品va视频免费观看| 欧美尿孔扩张虐视频| 亚洲精品免费一区亚洲精品免费精品一区 | 天天操夜夜操视频| 久久艹在线视频| 国产欧美高清视频在线| 亚洲女则毛耸耸bbw| 欧美日本国产视频| 在线视频超级|