function - Why is JavaScript code executed while condition is false? (Eloquent JavaScript - Deep comparison) -
question (eloquent js 2nd ed, chapter 4, exercise 4):
write function, deepequal, takes 2 values , returns true if same value or objects same properties values equal when compared recursive call deepequal.
test cases:
var obj = {here: {is: "an"}, object: 2}; var obj1 = {here: {is: "an"}, object: 2}; console.log(deepequal(obj,obj1));
code:
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; (var prop in x) { if (y.hasownproperty(prop)){ if (! deepequal(x[prop], y[prop])) //should not enter!! return false; alert('test'); }else return false; // section do? } return true; } else if (x !== y) return false; else return true; };
originaly fulfilled paul roub
main question: added alert block of code after if (! deepequal(x[prop], y[prop]))
statement kind of debugging, , have no idea why code inside still executed while statement supposed return true
, !
turns false
..?
in addition: }else return false;
for? (same statement) function seems work fine without section..
you added alert()
in such way runs when if
test fails, because didn't add { }
match intention indicated indentation. if if
test succeeds, following return
statement exit function , alert()
won't happen.
any code involves if
or else if
block returns nevertheless followed else
clause code smell. either else
or return
redundant; it's matter of style way go.
that code flawed in tests number of properties object.keys()
— implicitly looks @ "own" properties — uses for ... in
loop through x
without .hasownproperty()
check. (whether inherited properties should affect concept of "equality" subjective, should symmetric @ least.)
oh, , first else return false
clause after check see if y
has 1 of properties in x
quick exit. if y
doesn't have property name that's in x
, can't equal.
finally note sort of "deep" equality tester intends generic needs deal object graph cycles , other weirder things. (what of in object graph of x
refers part of y
, , vice versa?) deep object comparison not trivial thing.
Comments
Post a Comment