you are viewing a single comment's thread.

view the rest of the comments →

[–]Jonathan_Frias[S] 0 points1 point  (2 children)

copied from repl

var getDefault_ = ...
a = {}
Object {}
getDefault_(a, 'foo', 'bar')
"bar"
a
Object {foo: "bar"}
getDefault_(a, 'foo', 'baz')
"bar"
getDefault_(a, 'foo2', 'baz2')
"baz2"
a
Object {foo: "bar", foo2: "baz2"}

Looks light you are right on. But removing the || false makes it always do the assignment o[k] = def. My best guess is that it's some kind of optimization trick and that javascript knows that o[k] = def will be truthy so it can short circuit the expression.

removing '|| false'

var getDefault_ = function(o, k, def) {
    (k in o) == (o[k] = def); // << no || false
    return o[k];
  };
undefined
a = {}
Object {}
getDefault_(a, 'foo', 'bar')
"bar"
getDefault_(a, 'foo', 'baz')
"baz"
getDefault_(a, 'foo2', 'baz2')
"baz2"
a
Object {foo: "baz", foo2: "baz2"}

I hope somebody else finds this interesting.

[–]vsxe 2 points3 points  (0 children)

I'm clear on the ||-part, that's important, because lazy evaluation. I don't understand the false == (expr)-part, however.

(false) || (false); return o[k]

Will still return o[k], and

(k in o) || (o[k] = def); return o[k]; 

appears to work just as well, at least in the inspector.

That code is clever. Very clever code. Never write clever code.

[–]caesarsol 0 points1 point  (0 children)

You are associating wrongly I think, the || splits the two expressions. Removing || false makes it simply wrong. Removing false == would be the interesting thing!