<div dir="ltr"><div><div><div>Regarding operator overloading, I had a new idea last night.<br><br>Suppose we could express arithmetic operations on an object via a "well-defined" symbol (using the specification's terminology), named Symbol.arithmetic:<br><span style="font-family:monospace,monospace"><br></span></div><span style="font-family:monospace,monospace">let a = new Fraction(1, 2); // 1/2<br></span></div><div><span style="font-family:monospace,monospace">let b = new Complex(2, 5); // 2 + 5i<br><br></span></div><div><span style="font-family:monospace,monospace">a * b: function()<br>{<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">let ta = (typeof a == "number") || (a instanceof Number);<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">let tb = (typeof b == "number") || (b instanceof Number);<br><br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">if (ta && tb) {<br></span></div><div style="margin-left:80px"><span style="font-family:monospace,monospace">// just do the regular operation, as defined in ES7, section 12.7.3 (yawn)<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">}<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">if (typeof a[Symbol.arithmetic] == "function") {<br></span></div><div style="margin-left:40px"><div style="margin-left:40px"><span style="font-family:monospace,monospace">return a[Symbol.arithmetic](a, "*", b);</span><br></div></div><div style="margin-left:40px"><div style="margin-left:40px"><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace">}<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">if (typeof b[Symbol.arithmetic] == "function") {<br></span></div><div style="margin-left:80px"><span style="font-family:monospace,monospace">return b[Symbol.arithmetic](a, "*", b);<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">}<br></span></div><div><div style="margin-left:40px"><span style="font-family:monospace,monospace">return NaN;</span><br></div><div style="margin-left:40px"><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace">}</span><br></div><br><div>This
 algorithm would be compatible, I think, with existing JavaScript:  (new
 Object) * (new Object) == NaN right now.  This supports the traditional
 arithmetic and comparison operators, and the new ** operator rather 
well.<br><br></div><div>For unary operators + and -, just make the first argument 0, and let the third argument be the object.<br><br></div>For
 the assignment operator, only run the left-hand assignment test, and 
perhaps treat it like a property definition (returning truthy means the 
operation succeeded, false means it failed).<br><br></div>I am well aware that this doesn't cover other operators, like [].  This is just a starting suggestion.<br clear="all"><div><br>-- <br><div class="gmail_signature">"The first step in confirming there is a bug in someone else's work is confirming there are no bugs in your own."<br>-- Alexander J. Vincent, June 30, 2001</div>
</div></div>