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;?(同样的说法)没有这一部分,该功能似乎工作正常..
您添加了alert()这样一种方式,它只在if测试失败时运行,因为您没有添加{ }以匹配缩进指示的意图.如果if测试成功,则以下return语句将退出该函数,并且alert()不会发生.
任何涉及if或else if总是返回但仍遵循一个else子句的块的代码都是代码气味.无论是多余else的return还是多余的; 这是一种风格问题,你走哪条路.
该代码也有缺陷,因为它测试了属性的数量Object.keys()- 它隐含地仅查看"自己的"属性 - 但是然后使用a for ... in来循环x 而不进行.hasOwnProperty()检查.(遗传属性是否应该影响"平等"的概念是主观的,但它至少应该是对称的.)
哦,else return false检查后的第一个子句,看看是否y有一个属性x只是一个快速退出.如果y没有属性名称x,则它们不能相等.
最后请注意,任何想要通用的"深度"相等测试人员确实需要处理对象图周期和其他更奇怪的东西.(对象图中的某些内容x指的是部分内容y,反之亦然?)深层对象比较不是一件小事.