对象和数组没区分出来

来源:22-3 题目讲解-2:手写深度比较isEqual

小友友

2020-03-19

let obj1 = {
a: [‘x’,‘y’]
}

let obj2 = {
a: {‘0’:‘x’,‘1’:‘y’}
}

老师,您这个代码没区分对象和数组,这个例子输出是true,但实际结果并不是

写回答

2回答

小友友

提问者

2020-03-19

function isObject(obj) {
	return Object.prototype.toString.call(obj) === '[object Object]'
}

function isArray(arr) {
	return Object.prototype.toString.call(arr) === '[Object Array]'
}

function isEqual(obj1, obj2) {
	// 值类型
	if (obj1 === obj2) {
		return true
	}
	// 类型为对象并且元素个数相同
	if (isObject(obj1) && isObject(obj2) && Object.keys(obj1).length === Object.keys(obj2).length) {
        for (let key in obj1) {
        	if (obj1.hasOwnProperty(key)) {
        		// 递归
	            const res = isEqual(obj1[key], obj2[key])
			    if (!res) {
			    	return false
			    }
        	}
        	
        }
    // 类型为数组并且数组长度相同
	} else if(isArray(obj1) && isArray(obj2) && obj1.length === obj2.length) {
        for (let key in obj1) {
        	// 递归
        	const res = isEqual(obj1[key], obj2[key])
		    if (!res) {
		    	return false
		    }
        }
	} else {
		return false
	}
	return true
}


1
0

双越

2020-03-19

提的真问题非常好。

确实以目前的方式没分出来,可以在比较的时候,先判断一下类型。

0
0

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程