// 实现效果
let a = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
let b = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
console.log(a === b) // false
通常の状況では、2つのオブジェクトを等しくすることはできませんが、キーと値は同じですが、メモリポインターが異なるため、isEqual関数が実装されています
var result = isEqual(a, b)
console.log(result) // true
コード:
事前知識:Object.keys()
オブジェクトが渡された場合は、オブジェクトのキー配列を返します。渡されたものが配列の場合は、インデックス添え字配列を返します。
let c = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
console.log(Object.keys(c)) // ["name", "age", "major"]
let arr = ['1', '2', '3']
console.log(Object.keys(arr)) // ["0", "1", "2"]
コード:
// 判断是否是对象或者数组
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}
function isEqual (obj1, obj2) {
// 参数有一个不是对象 直接判断值是否相等就行
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2
}
// 如果两个数都是数组或者对象
// 1. 先比较keys的个数,如果个数不相同 直接就不想等了
var obj1Keys = Object.keys(obj1)
var obj2Keys = Object.keys(obj2)
if (obj1Keys.length !== obj2Keys.length) {
return false
}
// 如果个数相同再以obj1为基准 和 obj2依次递归比较
// for...in 适用于对象,也适用于数组
for (let key in obj1) {
const res = arguments.callee(obj1[key], obj2[key]) // 递归
if (!res) {
return false
}
}
return true
}
アレイとオブジェクトに適しています