April 09, 2016
I came across a tweet that had this bit of puzzling sample code:
Most of this made sense to me, except for the part of the properties being assigned and then either accessible or being undefined. I had a hunch that it was related to something I blogged about previously.
Turns out when using the .call it’s actually returning an object. That first line is the equivalent of var five = new Number(5); . This means:
var five = new Number(5); five instanceof Number; // true typeof five; // 'object'
While it’s an object, you can add your properties but as soon as it’s autoboxed/primitive wrapped by the ++ , it loses it’s abilities to hold those properties. This is shown by the fact that the instanceof and typeof values are now different:
// ... continuing from previous example five++; // is now 6 five instanceof Number; // false typeof five; // 'number'
The rest of the puzzle is playing with the timing of return values and the difference of an assignment from number++ and ++number.
At least that’s the way I understand it, let me know if I’ve missed anything.