请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

深度判断

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

//值类型判断
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回答

你把 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 回复 有任何疑惑可以回复我~
  • 提问者 溯白 #1
    对,但是我不太理解,为什么会走的FALSE那一步,为什么会有key=undefined,然后res为FALSE,最后return了FALSE
    回复 有任何疑惑可以回复我~ 2019-12-10 20:49:58
  • 双越 回复 提问者 溯白 #2
    “为什么会有key=undefined”,这个 undefined 也许就是上一步 isEqual 返回的,因为是递归调用。
    回复 有任何疑惑可以回复我~ 2019-12-10 21:29:05
  • 提问者 溯白 回复 双越 #3
    我懂了,谢谢老师
    回复 有任何疑惑可以回复我~ 2019-12-12 11:10:32
双越 2019-12-10 20:36:53

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

0 回复 有任何疑惑可以回复我~
  • 提问者 溯白 #1
    结果就是FALSE,没有undefined,我认为函数结果应该是undefined
    回复 有任何疑惑可以回复我~ 2019-12-10 20:38:59
  • weixin_慕的地2310058 回复 提问者 溯白 #2
    我看了以下,认为原因应该是这样的:
    按照你的函数,不加return true
    首先如果用isEqual比较只有一层的对象,比如
    isEqual({'a': 100, 'b': 200}, {'a': 100, 'b': 200}),就会返回undefined,没有问题。
    然而多层的对象的比较,比如这里两个对象都是
    {
      a: 100,
      b: {
        x: 100,
        y: 200
      }
    }
    递归比较obj1[b],和obj2[b]的结果本来应该是true,但是你把return true删掉了,就得到返回值是undefined。因为undefined是falsely变量,这时就触发了外层的 if (!res) return false
    
    所以这个false的返回值不是最后返回的,是在这一句返回的。
    回复 有任何疑惑可以回复我~ 2020-07-22 17:04:58
  • 提问者 溯白 回复 weixin_慕的地2310058 #3
    好的呢,谢谢
    回复 有任何疑惑可以回复我~ 2020-07-23 09:18:09
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信