摘要:原文出處相等是中起初最讓人困惑的部分。和的比較強(qiáng)制類(lèi)型的順序等等,都使得這個(gè)問(wèn)題變得復(fù)雜。依據(jù)引用的判斷會(huì)檢查所給的是否指向內(nèi)存中的相同地址。
原文出處:Object Equality in JavaScript
相等是JavaScript中起初最讓人困惑的部分。==和===的比較、強(qiáng)制類(lèi)型的順序等等,都使得這個(gè)問(wèn)題變得復(fù)雜。今天,我們會(huì)聚焦另一個(gè)方面:object相等是如何實(shí)現(xiàn)的。
你也許認(rèn)為,如果兩個(gè)object有相同的屬性并且它們多有的屬性值都相同,那么這兩個(gè)object應(yīng)該是相等的。我們來(lái)看看是否如我們所料:
var jangoFett = { occupation: "Bounty Hunter", genetics: "superb" }; var bobaFett = { occupation: "Bounty Hunter", genetics: "superb" }; // Outputs: false console.log(bobaFett === jangoFett);
bobaFett和jangoFett的屬性完全相同,但是兩個(gè)object并不認(rèn)為是相等的。難道是我們使用恒等運(yùn)算符的原因?我們來(lái)驗(yàn)證下:
// Outputs: false console.log(bobaFett == jangoFett);
我們這樣做,是因?yàn)镴avaScript內(nèi)部其實(shí)有兩套不同的方案來(lái)驗(yàn)證相等(譯者加:ecma規(guī)范中定義的[The Strict Equality Comparison Algorithm
](http://www.ecma-international...)。像字符串以及數(shù)值這種基本類(lèi)型是依據(jù)它們的值進(jìn)行比較的;但像數(shù)組、日期以及簡(jiǎn)單對(duì)象這類(lèi)object是根據(jù)它們的引用進(jìn)行判斷的。依據(jù)引用的判斷會(huì)檢查所給的object是否指向內(nèi)存中的相同地址。下面這個(gè)例子會(huì)闡述JavaScript中相等運(yùn)算符的實(shí)現(xiàn)原理:
var jangoFett = { occupation: "Bounty Hunter", genetics: "superb" }; var bobaFett = { occupation: "Bounty Hunter", genetics: "superb" }; var callMeJango = jangoFett; // Outputs: false console.log(bobaFett === jangoFett); // Outputs: true console.log(callMeJango === jangoFett);
一方面講,jangoFett和bobaFett這兩個(gè)變量引用自?xún)蓚€(gè)擁有完全相同屬性的object,但確實(shí)為兩個(gè)不同的實(shí)例;另一方面,jangoFett和callMeJango指向相同的實(shí)例。
因此,當(dāng)你想要驗(yàn)證對(duì)象相等時(shí),你需要清楚你是想要怎么的相等。如果你是想驗(yàn)證兩個(gè)實(shí)例是否完完全全相同,你可以使用JavaScript內(nèi)置的相等運(yùn)算符;抑或你是想驗(yàn)證兩個(gè)實(shí)例擁有“相同的值”,這樣的話(huà),你可能需要多做些工作。
以下是檢驗(yàn)object“值相等”的一種基本實(shí)現(xiàn):
function isEquivalent(a, b) { // Create arrays of property names var aProps = Object.getOwnPropertyNames(a); var bProps = Object.getOwnPropertyNames(b); // If number of properties is different, // objects are not equivalent if (aProps.length != bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i]; // If values of same property are not equal, // objects are not equivalent if (a[propName] !== b[propName]) { return false; } } // If we made it this far, objects // are considered equivalent return true; } // Outputs: true console.log(isEquivalent(bobaFett, jangoFett));
如你所見(jiàn),想要驗(yàn)證object實(shí)例“值相等”,我們必須去遍歷object中每個(gè)屬性,看其是否相等。如果我們把上面實(shí)現(xiàn)的這個(gè)簡(jiǎn)單方案應(yīng)用在我們的例子中,很多情況都是還沒(méi)有處理的。例如:
如果某個(gè)屬性是一個(gè)object
如果某個(gè)屬性值時(shí)NaN(JavaScript中唯一一個(gè)自身不相等自身的值)
如果a有個(gè)屬性的值為undefined,而b中沒(méi)有這個(gè)屬性(因此都等同于undefined)
想要一個(gè)檢驗(yàn)object實(shí)例“值相等”的健壯的方法,最好是使用一個(gè)涵蓋各種邊界情況的、經(jīng)過(guò)全面測(cè)試的庫(kù)。Underscore和Lo-Dash這兩個(gè)庫(kù)中的_.isEqual方法對(duì)處理object深度比較進(jìn)行了很好的實(shí)現(xiàn)。你可以這樣使用它們:
// Outputs: true console.log(_.isEqual(bobaFett, jangoFett));
希望這個(gè)JavaScript的小知識(shí)點(diǎn)能夠幫助你更好地理解object實(shí)例相等的實(shí)現(xiàn)原理。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102324.html
摘要:如果沒(méi)有傳入的話(huà)如果是類(lèi)型,則取否則,取這個(gè)方法大致和一樣,除了以下返回返回參考知乎中和區(qū)別是什么全面解析中的數(shù)據(jù)類(lèi)型與類(lèi)型轉(zhuǎn)換規(guī)范 有哪些判斷相等性的方法 JavaScript現(xiàn)在提供了三種方法來(lái)判斷相等性: ===,三個(gè)等號(hào)即嚴(yán)格相等 ==,兩個(gè)等號(hào)即寬松相等 Object.is(),ES6中用來(lái)判斷相等的方法 判斷相等性的細(xì)節(jié) ===(嚴(yán)格相等) 被比較的兩個(gè)數(shù)不會(huì)進(jìn)行類(lèi)型轉(zhuǎn)...
摘要:還規(guī)定了無(wú)窮及其它的相應(yīng)規(guī)范,有興趣可自行查找相關(guān)資料。其它相同數(shù)值相等。類(lèi)型中,引用同一對(duì)象,相等。不同點(diǎn)對(duì)的判斷上各有不同。以為代表的相等和相等以為代表的不相等和相等以為代表的相等和不相等相同類(lèi)型采用嚴(yán)格比較。 相等不相等? 先來(lái)隨便舉幾個(gè)?吧~ 0 == true //? [1] == [1] //? [1] == 1 ...
摘要:在比較字符串?dāng)?shù)值和布爾值的相等性時(shí),問(wèn)題還比較簡(jiǎn)單。后來(lái),有人提出了這種轉(zhuǎn)換到底是否合理的質(zhì)疑。相等時(shí)的隱式轉(zhuǎn)換對(duì)于操作符,通常都會(huì)先隱式轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換,然后再比較它們的相等性。要比較相等性之前,不能將和轉(zhuǎn)換成其他任何值。 確定兩個(gè)變量是否相等是編程中的一個(gè)非常重要的操作。 在比較字符串、數(shù)值和布爾值的相等性時(shí),問(wèn)題還比較簡(jiǎn)單。但在涉及到對(duì)象的比較時(shí),問(wèn)題就變得復(fù)雜了。最早的 ECMAS...
摘要:通常在轉(zhuǎn)換不同數(shù)據(jù)類(lèi)型時(shí),相等和不相等會(huì)遵循以下規(guī)則若有一個(gè)操作數(shù)是布爾值,則比較前會(huì)將布爾值轉(zhuǎn)換為數(shù)值轉(zhuǎn)為,轉(zhuǎn)為。 本文是 重溫基礎(chǔ) 系列文章的第十八篇。今日感受:優(yōu)化自己的代碼,也是很愉快的事情。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對(duì)象介紹 【重溫基礎(chǔ)】16.JSON對(duì)象介紹 【重溫基礎(chǔ)...
摘要:其他判斷構(gòu)造函數(shù)實(shí)例我們看個(gè)例子雖然和都是,但是和屬于不同構(gòu)造函數(shù)的實(shí)例,為了做出區(qū)分,我們認(rèn)為是不同的對(duì)象。 JavaScript 專(zhuān)題系列第十二篇,講解如何判斷兩個(gè)參數(shù)是否相等 前言 雖然標(biāo)題寫(xiě)的是如何判斷兩個(gè)對(duì)象相等,但本篇我們不僅僅判斷兩個(gè)對(duì)象相等,實(shí)際上,我們要做到的是如何判斷兩個(gè)參數(shù)相等,而這必然會(huì)涉及到多種類(lèi)型的判斷。 相等 什么是相等?在《JavaScript專(zhuān)題之去重...
閱讀 3251·2021-11-15 11:37
閱讀 2465·2021-09-29 09:48
閱讀 3829·2021-09-22 15:55
閱讀 3026·2021-09-22 10:02
閱讀 2650·2021-08-25 09:40
閱讀 3241·2021-08-03 14:03
閱讀 1709·2019-08-29 13:11
閱讀 1581·2019-08-29 12:49