简单地说,我不明白为什么他们在第二个if语句没有为示例返回false(null,null)
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object")
return false;
var propsInA = 0, propsInB = 0;
for (var prop in a)
propsInA += 1;
for (var prop in b) {
propsInB += 1;
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
return false;
}
return propsInA == propsInB;
}
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
答案 0 :(得分:0)
来自===
的定义。
正如Mozilla docs中所提到的那样,这实际上归结为x === y
的{{3}},其中(null, null)
表示:
... 1.如果Type(x)与Type(y)不同,则返回false。
... 3.如果Type(x)为Null,则返回true。
...
如果您使用null === null
调用您的函数,则:
类型(x)为空
∴true
⇒null
答案 1 :(得分:0)
使用definition from Ecma true
值的ECMA将始终返回false
。
所以 - 当你传递null
值时,你的函数将从不返回if
- 因为它总是会遇到第一个a === b
条件,{{ 1}}和return true;
。 return
语句会停止执行,并且永远不会达到第二个if
条件。
答案 2 :(得分:0)
如果您的代码执行return,则不会执行下一个代码..
答案 3 :(得分:0)
交换你的if语句。因为return将退出函数并返回null === null所以它将执行第一个循环并且不会进入下一个循环
function deepEqual(a, b) {
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") {
return false;
}
if (a === b) {
return true;
}
}
var c = null;
console.log(deepEqual(c, c));
答案 4 :(得分:0)
因为你正在返回。在第二个语句执行
之前
function deepEqual(a, b) {
if (a === b) {
//return true;
}
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") {
return false;
}
}
var c = null;
console.log(deepEqual(c, c));
答案 5 :(得分:0)
因为第一个陈述是真的,它从这里返回。返回后,下一行代码未执行。
function deepEqual(a, b) {
if (a === b) {
//return true;
}
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") {
return false;
}
}
var c = null;
console.log(deepEqual(c, c));

答案 6 :(得分:0)
正如其他人所提到的,你的函数会在第一个if语句ergo返回false时退出。
if (a === b) {
return true;
}
通常认为在您的函数中包含单个return语句是一种好习惯。在我们的例子中,我们可以将代码重构为:
function deepEqual(a, b) {
var ret = false;
if (a === b) {
ret = true;
} else if (a == null || typeof a != "object" ||
b == null || typeof b != "object") {
ret = false;
}
return ret;
}
这也迎合了另一个可能的问题。有一些a和b的值不会被if语句捕获并且会返回undefined。 e.g:
deepEqual([],{});