跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
LED灯珠捷比信 · 专业器件主题站

如何正确比较JavaScript中的对象

在JavaScript中比较值非常简单,只需使用相等运算符(例如严格的相等运算符)即可:但是对象具有结构化数据,因此比较起来更加困难。在本文中,您将学习如何正确比较JavaScript中的对象。 1.参考比较JavaScript提供了3种方法来比较值:严格等于运算符===宽松等于运算符== Object.is()函数当使用上述任何一种方法比较对象时,仅在比较时值引用同一对象实例,比较结果为true。这就是引用相等。让我们定义对象hero1和hero2,并检查实际的引用相等性:hero1 === hero1的计算结果为true,因为两个操作数均指向同一对象实例hero1。另一方面,hero1 === hero2的计算结果为假,因为hero1和hero2是不同的对象实例。有趣的是hero1和hero2对象的内容是相同的:两个对象都具有name属性,其值为'Batman'。但是,即使比较相同结构的对象,hero1 === hero2的结果也是错误的。当您想比较对象引用而不是它们的内容时,引用相等很有用。但是在更多情况下,您需要与对象的实际内容进行比较:例如属性及其值。接下来,让我们看看如何比较对象在内容上是否相等。 2.手动比较按内容比较对象的最直接方法是读取属性并手动比较它们。例如,让我们编写一个特殊的函数isHeroEqual()比较两个英雄对象:isHeroEqual()访问两个对象的属性名称并比较它们的值。如果要比较的对象具有某些属性,我更喜欢编写一个比较函数,例如isHeroEqual()。此类函数具有良好的性能:比较中仅涉及少数几个属性访问器和相等运算符。手动比较需要手动提取属性,这对于简单对象来说不是问题。但是,比较较大的对象(或结构未知的对象)很不方便,因为它需要大量样板代码。因此,让我们看一下对象的浅层比较可以提供什么样的帮助。 3.浅表比较如果使用浅表比较来检查对象,则必须获取两个对象的属性列表(使用Object.keys()),然后检查它们的属性值是否相等。以下代码是浅层比较的实现:在函数内部,key1和keys2是分别包含对象1和对象2的属性名称的数组。使用for循环遍历键并比较object1和object2的每个属性。使用浅层比较,您可以轻松地对具有许多属性的对象执行相等性检查:shallowEqual(hero1,hero2)返回true,因为对象hero1和hero2具有相同的属性(名称和realName),并且值也相同。另一方面,由于hero1和hero3具有不同的属性,shallowEqual(hero1,hero3)将返回false。但是JavaScript中的对象可以嵌套。在这种情况下,浅表比较无法正常工作。以下是对具有嵌套对象的对象的浅表比较检查:这次,即使两个对象hero1和hero2具有相同的内容,shallowEqual(hero1,hero2)也会返回false。发生这种情况是因为嵌套的对象hero1.address和hero2.address是不同的对象实例。因此,浅层比较将hero1.address和hero2.address视为两个不同的值。解决嵌套对象的问题需要深入的比较。 4.深层比较深层比较类似于浅层比较。区别在于,当对象包含在属性中时,将对嵌套对象执行递归浅比较。看一下深层比较的实现:areObjects&&在第13行!一旦deepEqual(val1,val2)检查该属性是否为对象,则递归调用将开始验证嵌套对象是否也相等。现在使用deepEquality()将对象与嵌套对象进行比较:深度比较功能可以正确确定hero1和hero2是否具有相同的属性和值,包括嵌套对象hero1.address和hero2.address的相等性。为了深入比较对象,我建议使用Node内置util模块的isDeepStrictEqual(object1,object2)(https://nodejs.org/api/util.html#util_util_isdeepstrictequal_val1_val2)(_ lodash库(https://lodash.com/docs/4.17.15#isEqual)的object2)。 5.总结引用相等性(使用===,==或Object.is()),以确定操作数是否是相同的对象实例。要手动检查对象是否相等,需要手动比较属性值。阿尔斯