日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

比較JavaScript對象的四種方式

瀏覽:231日期:2023-09-30 14:46:39
前言

比較JavaScript中的原始值非常簡單。只需使用任何一種可用的相等運(yùn)算符即可,例如嚴(yán)格相等運(yùn)算符:

’a’ === ’c’; // => false1 === 1; // => true

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

引用比較

JavaScript 提供了 3 種對值進(jìn)行比較的方法:

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

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

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

const hero1 = { name: ’Batman’};const hero2 = { name: ’Batman’};hero1 === hero1; // => truehero1 === hero2; // => falsehero1 == hero1; // => truehero1 == hero2; // => falseObject.is(hero1, hero1); // => trueObject.is(hero1, hero2); // => false

hero1 === hero1的計算結(jié)果為true,因?yàn)閮蓚€操作數(shù)均指向了同一個對象實(shí)例hero1。

另一方面,hero1 === hero2的計算結(jié)果為false,因?yàn)閔ero1和hero2是不同的對象實(shí)例。

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

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

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

手動比較

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

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

function isHeroEqual(object1, object2) { return object1.name === object2.name;}const hero1 = { name: ’Batman’};const hero2 = { name: ’Batman’};const hero3 = { name: ’Joker’};isHeroEqual(hero1, hero2); // => trueisHeroEqual(hero1, hero3); // => false

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

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

手動比較需要手動提取屬性,對于簡單對象來說,這不是問題。但是,要對較大的對象(或結(jié)構(gòu)未知的對象)進(jìn)行比較,就不方便了,因?yàn)樗枰罅康臉影宕a。

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

淺層比較

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

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

function shallowEqual(object1, object2) { const keys1 = Object.keys(object1); const keys2 = Object.keys(object2); if (keys1.length !== keys2.length) { return false; } for (let index = 0; index < keys1.length; index++) { const val1 = object1[keys1[index]]; const val2 = object2[keys2[index]]; if (val1 !== val2) { return false; } } return true;}

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

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

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

const hero1 = { name: ’Batman’, realName: ’Bruce Wayne’};const hero2 = { name: ’Batman’, realName: ’Bruce Wayne’};const hero3 = { name: ’Joker’};shallowEqual(hero1, hero2); // => trueshallowEqual(hero1, hero3); // => false

shallowEqual(hero1, hero2) 返回 true,因?yàn)閷ο?hero1 和 hero2 具有

相同的屬性(name和realName),并且值也相同。

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

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

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

const hero1 = { name: ’Batman’, address: { city: ’Gotham’ }};const hero2 = { name: ’Batman’, address: { city: ’Gotham’ }};shallowEqual(hero1, hero2); // => false

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

發(fā)生這種情況是因?yàn)榍短讓ο骽ero1.address和hero2.address是不同的對象實(shí)例。因此,淺層比較認(rèn)為hero1.address和hero2.address是兩個不同的值。

解決嵌套對象的問題需要進(jìn)行深層比較。

深層比較

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

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

function deepEqual(object1, object2) { const keys1 = Object.keys(object1); const keys2 = Object.keys(object2); if (keys1.length !== keys2.length) { return false; } for (let index = 0; index < keys1.length; index++) { const val1 = object1[keys1[index]]; const val2 = object2[keys2[index]]; const areObjects = isObject(val1) && isObject(val2); if (areObjects && !deepEqual(val1, val2) || !areObjects && val1 !== val2) { return false; } } return true;}function isObject(object) { return object != null && typeof object === ’object’;}

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

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

const hero1 = { name: ’Batman’, address: { city: ’Gotham’ }};const hero2 = { name: ’Batman’, address: { city: ’Gotham’ }};deepEqual(hero1, hero2); // => true

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

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

總結(jié)

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

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

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

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

以上就是比較JavaScript對象的四種方式的詳細(xì)內(nèi)容,更多關(guān)于JavaScript的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀精品一区二区三区在线观看| 麻豆精品久久| 欧美aa在线观看| 久久影院资源站| 精品亚洲a∨| 精品国产亚洲一区二区在线观看| 国产精品久久久久av蜜臀| 91成人在线网站| 国产调教精品| 久久99视频| 国产精选在线| 99精品在线观看| 亚洲女同中文字幕| 国产精品毛片在线看| 久久精品高清| 在线亚洲国产精品网站| 香蕉精品999视频一区二区| 丝袜美腿一区二区三区| 一区二区三区午夜视频| 香蕉久久一区| 国产精品大片| 97精品在线| 欧美日韩国产高清电影| 日韩视频一区| 日本在线成人| 欧美成人一二区| 成人一区而且| 久久人人99| 免费美女久久99| 日韩精品乱码av一区二区| 国产精品视频首页| аⅴ资源天堂资源库在线| 国产99久久| 亚洲精品在线国产| 国产精品久久久久久久久久久久久久久 | 久久久精品国产**网站| 国产欧美日韩亚洲一区二区三区| 久久一区精品| 精品中文一区| 日韩在线成人| 国产一区二区精品福利地址| 欧美~级网站不卡| 日韩avvvv在线播放| 国产精品成人a在线观看| 亚洲精品1区| 国产精品亚洲产品| 欧美日韩在线网站| 午夜视频一区二区在线观看| 国产中文欧美日韩在线| 亚洲午夜电影| 91精品一区| 亚洲国产福利| 免费在线观看成人| 97在线精品| 亚洲三级精品| 久久青青视频| 亚洲精品看片| 欧美精品资源| 国产伦精品一区二区三区在线播放| 九色porny丨国产首页在线| 亚洲色图综合| 天堂日韩电影| 国产精品一区二区三区www| 国产91精品对白在线播放| 久久国产免费看| 欧美69视频| 国产精品亲子伦av一区二区三区| 激情婷婷欧美| 久久99国产精品视频| 亚洲一区二区三区高清| 四虎国产精品免费观看| 四虎成人精品一区二区免费网站 | 久久不见久久见中文字幕免费| 不卡av一区二区| 美女视频网站久久| 亚洲三级视频| 午夜国产欧美理论在线播放| 精品国内亚洲2022精品成人| 国产亚洲永久域名| 日韩在线短视频| 亚洲精品亚洲人成在线观看| 成人精品天堂一区二区三区| 国产精品天天看天天狠| 亚洲三级国产| 亚洲激精日韩激精欧美精品| 在线中文字幕播放| 国产欧美日韩视频在线| 水野朝阳av一区二区三区| 在线亚洲人成| 国产精品1区| 一区二区国产在线| 极品日韩av| 成人黄色av| 欧美国产极品| 91九色综合| 水野朝阳av一区二区三区| 欧美sss在线视频| 国产一区二区三区探花| 欧美天堂在线| 亚欧成人精品| 亚洲五月综合| 亚洲综合精品四区| re久久精品视频| 久久九九电影| 日本午夜大片a在线观看| 欧美激情福利| 国产精品一区三区在线观看| 日日夜夜免费精品| 亚洲伊人影院| 中文不卡在线| 视频精品一区二区| 国产精品毛片在线| 精品欧美久久| 免费不卡中文字幕在线| 蜜臀国产一区| 麻豆视频在线看| 97精品97| 日韩精品免费一区二区三区| 成人午夜精品| 日韩精品麻豆| 久久狠狠婷婷| 久久精品国产亚洲夜色av网站| 久久精品影视| 精品在线99| 在线视频免费在线观看一区二区| 婷婷丁香综合| 一区二区亚洲精品| 夜久久久久久| 一本一道久久a久久| 日本一区二区三区视频在线看| 亚洲91在线| 国产精品一区二区美女视频免费看| 欧美在线观看天堂一区二区三区| 日韩精品视频中文字幕| 欧美影院视频| 麻豆精品在线播放| a日韩av网址| 亚洲精品一二三区区别| 综合激情五月婷婷| 日韩va亚洲va欧美va久久| 青草国产精品| 国产精品九九| 国产不卡精品| 日本国产精品| 老鸭窝毛片一区二区三区| 天堂精品久久久久| 国产精品xxx| 麻豆网站免费在线观看| 99精品视频精品精品视频| 国产亚洲高清视频| 日韩有码av| 国际精品欧美精品| 日本精品不卡| 久久高清国产| 国产日韩免费| 精品国产乱码| 蜜臀av免费一区二区三区| 首页亚洲欧美制服丝腿| 日韩精品第一| 国产+成+人+亚洲欧洲在线| 久久国产影院| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩有码av| 精品国产午夜肉伦伦影院| 天堂日韩电影| 日韩区欧美区| 国产一区二区三区久久| 久久亚洲在线| 日韩福利视频网| 天堂av在线| 六月天综合网| 国产精品xxxav免费视频| 久久精品国产www456c0m| 亚洲一区二区三区久久久| 国产精品一区二区美女视频免费看| 一区二区三区四区日本视频| 巨乳诱惑日韩免费av| 老司机免费视频一区二区三区| 亚洲韩日在线| 欧美日韩中出| 国产精品av一区二区| 日韩精品免费一区二区夜夜嗨| 手机在线电影一区| 久久高清国产| 国产91在线播放精品| 国产精品外国| 久久久精品国产**网站| 99视频在线精品国自产拍免费观看| 久久av综合| 99热精品在线观看| 麻豆精品在线播放| 免费观看日韩电影| 成人在线免费观看网站| 蜜桃视频一区二区三区在线观看| 久久精品系列| 亚洲精选av| 成人久久久久| 欧美国产另类| 免费在线观看不卡| 日韩免费小视频|