深度判断
来源: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回答
-
你把 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 的地方。
你再根据返回结果,仔细分析一下。
032019-12-12 -
双越
2019-12-10
“但是又走了一遍,最后结果是false,为什么?” —— 意思是说,有时候返回 undefined ,有时候返回 false 吗?
032020-07-23