为什么在条件为false时执行JavaScript代码?(有说服力的JavaScript-深度比较)

为什么在条件为false时执行JavaScript代码?(有说服力的JavaScript-深度比较),javascript,function,if-statement,Javascript,Function,If Statement,问题(雄辩的JS第二版,第4章,练习4): 编写一个函数deepEqual,它接受两个值并返回true 仅当它们是相同的值或具有相同属性的对象时 与递归函数相比,其值也相等的属性 呼唤平等 测试用例: var obj = {here: {is: "an"}, object: 2}; var obj1 = {here: {is: "an"}, object: 2}; console.log(deepEqual(obj,obj1)); 代码: 最初由 主要问题:我刚刚在if(!deepEqual(

问题(雄辩的JS第二版,第4章,练习4):

编写一个函数deepEqual,它接受两个值并返回true 仅当它们是相同的值或具有相同属性的对象时 与递归函数相比,其值也相等的属性 呼唤平等

测试用例:

var obj = {here: {is: "an"}, object: 2};
var obj1 = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj,obj1));
代码:

最初由

主要问题:我刚刚在
if(!deepEqual(x[prop],y[prop])
语句类调试之后向代码块添加了警报,现在我不知道为什么在语句本身应该返回
true
的情况下仍然执行内部代码将其设置为“假”
。?
另外:什么是
}否则返回false用于?(同一句话)如果没有这个部分,函数似乎可以正常工作。

您添加了
警报()
,因为您没有添加
{}
以匹配缩进所指示的意图,所以它只在
测试失败时运行。如果
If
测试成功,则以下
return
语句将退出该函数,并且不会出现
警报()

任何包含
if
else if
块且始终返回,但后跟
else
子句的代码都是代码气味。
else
return
是冗余的;你走哪条路是风格的问题

该代码也有缺陷,因为它使用
Object.keys()
(隐式地只查看“自己的”属性)测试属性的数量,但随后使用
作为。。。在
中循环通过
x
而不使用
.hasOwnProperty()
检查。(继承财产是否应该影响“平等”的概念是主观的,但至少应该是对称的。)

哦,检查
y
是否具有
x
中的属性之一之后的第一个
else返回false
子句只是一个快速退出。如果
y
没有位于
x
中的属性名称,则它们不能相等

最后要注意的是,任何一种“深度”平等测试仪,如果想要成为通用的,都需要处理对象图周期和其他更奇怪的事情。(在
x
的对象图中,什么东西是指
y
的一部分,反之亦然?)深度对象比较不是一件小事。

您添加了
警报()
,这样它只在
如果
测试失败时运行,因为您没有添加
{}
以匹配缩进指示的意图。如果
If
测试成功,则以下
return
语句将退出该函数,并且不会出现
警报()

任何包含
if
else if
块且始终返回,但后跟
else
子句的代码都是代码气味。
else
return
是冗余的;你走哪条路是风格的问题

该代码也有缺陷,因为它使用
Object.keys()
(隐式地只查看“自己的”属性)测试属性的数量,但随后使用
作为。。。在
中循环通过
x
而不使用
.hasOwnProperty()
检查。(继承财产是否应该影响“平等”的概念是主观的,但至少应该是对称的。)

哦,检查
y
是否具有
x
中的属性之一之后的第一个
else返回false
子句只是一个快速退出。如果
y
没有位于
x
中的属性名称,则它们不能相等


最后要注意的是,任何一种“深度”平等测试仪,如果想要成为通用的,都需要处理对象图周期和其他更奇怪的事情。(在
x
的对象图中,什么东西是指
y
的一部分,反之亦然?)深度对象比较不是一件小事。

这正是为什么在if语句中永远不应该忽略“{}”的原因……这正是为什么在if语句中永远不应该忽略“{}”的原因。。。
var deepEqual = function (x, y) {
    if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
        if (Object.keys(x).length != Object.keys(y).length)
          return false;

        for (var prop in x) {
          if (y.hasOwnProperty(prop)){  
            if (! deepEqual(x[prop], y[prop])) //should not enter!!
                return false;
                alert('test');
          }else return false; // What does this section do?
        }
        return true;
    }
    else if (x !== y)
        return false;
    else
        return true;
};