判断两个数据是否相等
1. 普通数据类型
JavaScript 中有 2 种方法可以判断两个数据是否相等:
- 使用运算符 ==,这种方法会自动进行类型转换,例如 “5” == 5 为 true。
- 使用运算符 ===,这种方法不会进行类型转换,例如 “5” === 5 为 false。
很多小伙伴再判断两个值是否相等都喜欢用===,ES6 中新增了一个 Object.is(val1,val2)方法
对于 Object.is 来说,其运行结果在大部分情况中与===运算符相同,唯一的区别在于+0 和-0 被识别为不相等并且 NaN 与 NaN 等价。
1 | +0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true |
2. 复杂数据类型
当比较两个复杂数据类型的值时,例如对象和数组,使用 == 或 === 运算符是不能得到正确结果的。 因为他们是比较对象或数组的地址而不是它们的值。
可以使用如下方法:
- 使用 JSON.stringify() 将对象或数组转化为字符串,然后比较字符串是否相等。
优点:用法简单,对于顺序相同的两个对象可以快速进行比较得到结果
缺点:这种方法有限制就是当两个对比的对象中 key 的顺序不是完全相同时会比较出错
- 使用 Lodash 的 isEqual() 方法,它可以递归地比较两个对象或数组是否相等。
- 自己实现递归来比较对象或数组的每一项
1 | function isEqual(a, b) { if (a === b) return true; if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime(); if (!a || !b || (typeof a != 'object' && typeof b != 'object')) return a === b; if (a.prototype !== b.prototype) return false; let keys = Object.keys(a); if (keys.length !== Object.keys(b).length) return false; return keys.every(k => isEqual(a[k], b[k])); } |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 月山!
评论