面试时有一个题目,手写一个对比两个对象是否相同的方法 题目是:
const a = {}
const b = {} as any
const c = {}
const d = {}
const fn = () => {
return 1
}
;[a, b, c, d].forEach((item: any) => {
// item.a = 1
// item.b = 2
// item.c = 3
// item.d = 4
item.a = a
item.b = b
item.c = c
item.d = d
item.fn = fn
})
const isEqual = (d1: any, d2: any) => {
// coding
}
b.name = 2
console.log('is equal 1', isEqual(a, b))
console.log('is equal 2', isEqual(c, d))
题目中涉及到循环引用,下面是我实现的,经测试正常
const isEqual = (d1: any, d2: any) => {
let layMap = new WeakMap()
const isObject = (data: any) => {
return data instanceof Object
}
const dataType = (data: any) => {
return Object.prototype.toString.call(data)
}
if (!isObject(d1) || !isObject(d2)) {
return d1 === d2
}
if (Object.keys(d1).length != Object.keys(d2).length) {
return false
}
if (dataType(d1) != dataType(d2)) {
return false
}
for (let key in d1) {
// if (dataType(d1[key]) != dataType(d2[key])) {
// return false;
// }
layMap.set(d1[key], d1[key])
if (!layMap.has(d2[key])) {
if (!isEqual(d1[key], d2[key])) {
return false
}
}
}
// test
return true
}