JavaScript中比较对象的几种方式


本文摘自PHP中文网,作者青灯夜游,侵删。

下面本篇文章给大家解决一下正确比较 JavaScript 对象的四种方式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

比较 JavaScript 中的原始值非常简单。只需使用任何一种可用的相等运算符即可,例如严格相等运算符:

1

2

'a' === 'c'; // => false

1   === 1;   // => true

但是对象却有结构化数据,所以比较起来比较困难。在本文中,你将学习如何正确比较 JavaScript 中的对象。

1. 引用比较

JavaScript 提供了 3 种对值进行比较的方法:

  • 严格相等运算符 ===
  • 宽松相等运算符 ==
  • Object.is() 函数

当使用上述任何一种方法比较对象时,只有在比较的值引用了相同的对象实例时,比较的评估结果为 true。这就是参照相等性

让我们定义对象 hero1hero2 ,并查看实际中的参照相等性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

const hero1 = {

  name: 'Batman'

};

const hero2 = {

  name: 'Batman'

};

 

hero1 === hero1; // => true

hero1 === hero2; // => false

 

hero1 == hero1; // => true

hero1 == hero2; // => false

 

Object.is(hero1, hero1); // => true

Object.is(hero1, hero2); // => false

hero1 === hero1 的计算结果为 true,因为两个操作数均指向了同一个对象实例 hero1

另一方面,hero1 === hero2 的计算结果为 false,因为 hero1hero2 是不同的对象实例。

有意思的是,hero1hero2 对象的内容是相同的:两个对象都有一个 name 属性,它的其值是 'Batman'。尽管如此,即使比较相同结构的对象,hero1 === hero2 的结果也是 false

当你想比较对象引用而不是它们的内容时,引用相等是很有用的。但是在更多的情况之下,你都想针对对象的实际内容进行比较:例如属性及它们的值。

接下来看看如何通过对象的内容比较对象是否相等。

2.手动比较

按内容比较对象最直接的方法是读取属性并手动比较它们。

例如,让我们编写一个特殊的函数 isHeroEqual() 来比较两个 hero 对象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function isHeroEqual(object1, object2) {

  return object1.name === object2.name;

}

 

const hero1 = {

  name: 'Batman'

};

const hero2 = {

  name: 'Batman'

};

const hero3 = {

  name: 'Joker'

};

 

isHeroEqual(hero1, hero2); // => true

isHeroEqual(hero1, hero3); // => false

isHeroEqual() 访问两个对象的属性 name 并比较它们的值。

如果被比较的对象具有一些属性,我更喜欢编写诸如 isHeroEqual() 之类的比较函数。这类函数具有良好的性能:在比较中只会涉及少数几个属性访问器和相等运算符。

手动比较需要手动提取属性,对于简单对象来说,这不是问题。但是,要对较大的对象(或结构未知的对象)进行比较,就不方便了,因为它需要大量的样板代码。

那么让我们来看看对象的浅层比较能提供哪些帮助。

3. 浅层比较

如果用浅层比较检查对象,你必须获取两个对象的属性列表(使用 Object.keys()),然后检查它们的属性值是否相等。

下面的代码是浅层比较的一种实现方式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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;

}

在函数内部,keys1keys2 是分别包含 object1object2 属性名称的数组。

for 循环遍历键,并比较 object1object2 的每个属性。

使用浅层比较,你可以轻松对有着许多属性的对象进行相等性检查:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

const hero1 = {

  name: 'Batman',

  realName: 'Bruce Wayne'

};

const hero2 = {

  name: 'Batman',

  realName: 'Bruce Wayne'

};

const hero3 = {

  name: 'Joker'

};

 

shallowEqual(hero1, hero2); // => true

shallowEqual(hero1, hero3); // => false

shallowEqual(hero1, hero2) 返回 true,因为对象 hero1hero2 具有相同的属性(namerealName),并且值也相同。

阅读剩余部分

相关阅读 >>

详解javascript中的proxy(代理)

javascript语言有什么特点

javascript要什么基础?

同时去掉字符串左边和右边空格的函数是什么?

javascript归属哪个公司

javascript数组怎么删除指定元素

javascript是什么格式的文件

javascript怎么移除数组元素

javascript的$是啥

javascript函数的写法有哪些

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...