深度判断

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

溯白

2019-12-10

老师,我写深度判断的时候

//值类型判断
function isObject(obj){
	return typeof obj === 'object' && obj !== null
}
function isEqual(obj1,obj2){
	//值类型判断
	if (!isObject(obj1) || !isObject(obj2)) {
		return obj1 === obj2
	}
	//传入obj相同
	if (obj1 === obj2) {
		return true
	}
	//递归判断
	const obj1Key = Object.keys(obj1)
	const obj2Key = Object.keys(obj2)
	//先判断长度
	if (obj1Key.length !== obj2Key.length) {
		return false
	}
	for (let key in obj1) {
		let res = isEqual(obj1[key],obj2[key])
		if (!res) {
			return false
		}
	}
	// return true
}
//测试
const obj1 = {
	a:100,
	b:{
		x:100,
		y:200
	}
}
const obj2 = {
	a:100,
	b:{
		x:100,
		y:200
	}
}
console.log(isEqual(obj1,obj2))

把return true注掉,我觉得结果应该是undefined,但是控制台返回的是false,我打断点调试,最后一圈key的确是undefined,函数返回也是undefined,但是又走了一遍

if (!res) {
    return false
}

最后结果是false,为什么?

写回答

2回答

双越

2019-12-10

你把 isEqual 函数简单改造一下,加三行 console.log,如下

function isEqual(obj1,obj2){
    //值类型判断
    if (!isObject(obj1) || !isObject(obj2)) {
	console.log(10) // 这加一行
        return obj1 === obj2
    }
    //传入obj相同
    if (obj1 === obj2) {
        return true
    }
    //递归判断
    const obj1Key = Object.keys(obj1)
    const obj2Key = Object.keys(obj2)
    //先判断长度
    if (obj1Key.length !== obj2Key.length) {
	console.log(20) // 这加一行
        return false
    }
    for (let key in obj1) {
        let res = isEqual(obj1[key],obj2[key])
        if (!res) {
	    console.log(30) // 这加一行
            return false
        }
    }
    // return true
}

然后再执行,你就能看到,函数确实走到了返回 false 的地方。

你再根据返回结果,仔细分析一下。

0
3
溯白
回复
双越
我懂了,谢谢老师
2019-12-12
共3条回复

双越

2019-12-10

“但是又走了一遍,最后结果是false,为什么?” —— 意思是说,有时候返回 undefined ,有时候返回 false 吗?

0
3
溯白
回复
weixin_慕的地2310058
好的呢,谢谢
2020-07-23
共3条回复

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程