前言
JS中判断两个变量是否相等,是我们经常遇到的问题。今天我要探讨的问题是如何优雅的比较复杂变量。
- JS中比较变量相等的原生方法
-
==
和===
(建议都使用===
,因为==
造成类型隐形转换) Object.is(value1, value2)
value.toString()
- ...等等一些方法
-
以上的方法都只能比较简单变量,无法比较引用类型变量(如Array
,Object
)。如何优雅判断复杂变量是否相等? 不多废话,直接上代码。
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}
function isEqual(a, b) {
if (a === b) return true
var isObjectA = isObject(a)
var isObjectB = isObject(b)
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a)
var isArrayB = Array.isArray(b)
if (isArrayA && isArrayB) { // a b都是数组
return a.length === b.length && a.every((el, index) => isEqual(el, b[index]))
} else if (a instanceof Date && b instanceof Date) { // a b都是Date对象
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) { // 此时a b都是纯对象
var keyA = Object.keys(a)
var keyB = Object.keys(b)
return keyA.length === keyB.length && keyA.every(key => isEqual(a[key], b[key]))
} else {
return false
}
} catch (e) {
console.log(e)
return false
}
} else if (!isObjectA && !isObjectB) { // a b 可能是string,number,boolean,undefined中的一种
return String(a) === String(b)
} else {
return false
}
}
这个isEqual
函数可以判断绝大部分复杂对象 (除了对象中有函数的)
本人是刚入前端的新人。如有错误,烦请指正
永远不要抛弃理想, 在前端这条路上,冲吧!