为什么在条件为false时执行JavaScript代码?(有说服力的JavaScript-深度比较)
问题(雄辩的JS第二版,第4章,练习4): 编写一个函数deepEqual,它接受两个值并返回true 仅当它们是相同的值或具有相同属性的对象时 与递归函数相比,其值也相等的属性 呼唤平等 测试用例:为什么在条件为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(
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;
};