<div dir="ltr">On the surface `O instanceof C` boxes `C`, but when using `GetMethod` O turns O into an Object. This means `instanceof` is temporarily turning O into an Object.<div><br></div><div>For primitives, all the operators in JS have been unable to be altered until this was pointed out. `1 instanceof C` is able to be changed by mutating %NumberPrototype% , `"" instanceof C` by mutating %StringPrototype% , etc.</div><div><br></div><div>Compared to other operators this is new and a bit surprising that primitive behaviors are mutable.</div><div><br></div><div>I would expect this behavior by boxing primitives via `Object(primitive) instanceof C` but not for primitives.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 15, 2015 at 8:43 PM, Allen Wirfs-Brock <span dir="ltr"><<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div class="h5"><br><div><div>On Jun 15, 2015, at 10:06 AM, Bradley Meck wrote:</div><br><blockquote type="cite"><div dir="ltr">Kyle Simpson caused the discovery of this oddity :<br><br><a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-instanceofoperator" target="_blank">https://people.mozilla.org/~jorendorff/es6-draft.html#sec-instanceofoperator</a> calls GetMethod on C without checking if it is an Object, this means `1 instanceof Foo` could be affected by mutating `Number.prototype[Symbol.hasInstance]`.<div><br>I am assuming this is unintended?</div></div></blockquote><br></div></div></div><div>No, it is exactly as intended:</div><div><br></div><div><div>GetMethod users GetV <a href="http://people.mozilla.org/~jorendorff/es6-draft.html#sec-getv" target="_blank">http://people.mozilla.org/~jorendorff/es6-draft.html#sec-getv</a> which handles accessing properties for primitives. For primitive values, it uses the built-in wrapper prototype to lookup properties, but it does not actually create a boxed primitive value.</div><div><br></div><div>`this` object boxing is a characteristic of the callee, not the caller.  Non-srict functions box primitive `this values` that are passed to them, strict mode functions do not.</div><div><br></div><div>This is all the standard method invocation behavior, and the `instanceof` operator just does a normal method invocation if it finds a  `Symbol.hasInstance` method.  Because Function.prototype implements `Symbol.hasInstacce` all function haves the default legacy behavior when appearing right-side operand of `instanceof`</div><div><br></div><div>But `instanceof` does not depend upon the existence of a  a  `Symbol.hasInstance` method.  It falls back to performing the default  (legacy) instanceof check if a callable `hasInstance` property value is not found.  </div><div><br></div><div>But, back to the original question:  Exactly what do you expect to be  boxed for `1 instance of Foo`?  The `C` that GetMethod is applied to is `Foo` which would normally be a constructor or some other "type-like" object implements.  It could be a primitive numeric value (eg, `5 instanceof 4`) which will cause the fallback to be taken using Number.prototype has a `Symbol.hasInstance` callable property.  But, even if it does why would you expect anything to box?</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Allen</div></font></span></div><br></div></blockquote></div><br></div>