电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

比較JavaScript對(duì)象的四種方式

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

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

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

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

引用比較

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

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

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

讓我們定義對(duì)象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的計(jì)算結(jié)果為true,因?yàn)閮蓚€(gè)操作數(shù)均指向了同一個(gè)對(duì)象實(shí)例hero1。

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

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

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

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

手動(dòng)比較

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

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

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()訪問兩個(gè)對(duì)象的屬性name并比較它們的值。

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

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

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

淺層比較

如果用淺層比較檢查對(duì)象,你必須獲取兩個(gè)對(duì)象的屬性列表(使用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的每個(gè)屬性。

使用淺層比較,你可以輕松對(duì)有著許多屬性的對(duì)象進(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)閷?duì)象 hero1 和 hero2 具有

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

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

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

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

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

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

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

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

深層比較

深層比較與淺層比較相似,不同之處在于,當(dāng)屬性中包含對(duì)象時(shí),將對(duì)嵌套對(duì)象執(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)一旦檢查到的屬性是對(duì)象,則遞歸調(diào)用將會(huì)開始驗(yàn)證嵌套對(duì)象是否也相等。

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

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

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

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

總結(jié)

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

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

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

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

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

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 道康宁消泡剂-瓦克-大川进口消泡剂供应商 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 |