为什么在条件为假时执行JavaScript代码?(雄辩的JavaScript - 深度比较)

Den*_*rch 1 javascript if-statement function

问题(Eloquent JS 2nd Ed,第4章,练习4):

编写一个函数deepEqual,它接受两个值,只有当它们是相同的值时返回true,或者是与对deepEqual的递归调用相比,其值也相等的对象.

测试用例:

var obj = {here: {is: "an"}, object: 2};
var obj1 = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj,obj1));
Run Code Online (Sandbox Code Playgroud)

码:

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;
};
Run Code Online (Sandbox Code Playgroud)

最初由Paul Roub完成

主要问题:我刚刚在语句之后添加了对代码块的警告,if (! deepEqual(x[prop], y[prop]))就像调试一样,现在我不知道为什么代码里面仍然执行,而语句本身应该返回true!转动它false
另外:什么是}else return false;?(同样的说法)没有这一部分,该功能似乎工作正常..

Poi*_*nty 6

您添加了alert()这样一种方式,它只在if测试失败时运行,因为您没有添加{ }以匹配缩进指示的意图.如果if测试成功,则以下return语句将退出该函数,并且alert()不会发生.

任何涉及ifelse if总是返回但仍遵循一个else子句的块的代码都是代码气味.无论是多余elsereturn还是多余的; 这是一种风格问题,你走哪条路.

该代码也有缺陷,因为它测试了属性的数量Object.keys()- 它隐含地仅查看"自己的"属性 - 但是然后使用a for ... in来循环x 而不进行.hasOwnProperty()检查.(遗传属性是否应该影响"平等"的概念是主观的,但它至少应该是对称的.)

哦,else return false检查后的第一个子句,看看是否y有一个属性x只是一个快速退出.如果y没有属性名称x,则它们不能相等.

最后请注意,任何想要通用的"深度"相等测试人员确实需要处理对象图周期和其他更奇怪的东西.(对象图中的某些内容x指的是部分内容y,反之亦然?)深层对象比较不是一件小事.