Operator overloading for non-value objects

Brendan Eich brendan at mozilla.com
Tue Jan 14 17:37:04 PST 2014

Kevin Smith wrote:
> What about:
>     0L == "0"

So glad you asked, and you will like the answer:

js> 0L == "0"
typein:2:0 TypeError: no operator function found for ==


For the expression v + u

 1. Let p = v.[[Get]](@@ADD)
 2. If p is not a Set, throw a TypeError
 3. Let q = u.[[Get]](@@ADD_R)
 4. If q is not a Set, throw a TypeError
 5. Let r = p intersect q
 6. If r.size != 1 throw a TypeError
 7. Let f = r[0]; if f is not a function, throw
 8. Evaluate f(v, u) and return the result

If v or u is a string, no handed-operator-symbol-named set on prototype 

> How is "===" defined for user-defined value types?  In terms of the T 
> == T overload?

You did not read 

Strict Equality Operators

  * The strict equality operators, === and !==, cannot be overloaded
  * They work on frozen-by-definition value objects via a structural
    recursive strict equality test (beware, NaN !== NaN)
  * Same-object-reference remains a fast-path optimization

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140114/5fd47543/attachment.html>

More information about the es-discuss mailing list