请稍等 ...
×

采纳答案成功!

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

深度判断

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//值类型判断
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,但是又走了一遍

1
2
3
if (!res) {
    return false
}

最后结果是false,为什么?

正在回答

插入代码

2回答

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号