On Thu, Nov 13, 2008 at 10:31 AM, Allen Wirfs-Brock <span dir="ltr">&lt;<a href="mailto:Allen.Wirfs-Brock@microsoft.com">Allen.Wirfs-Brock@microsoft.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">









<div link="blue" vlink="purple" lang="EN-US">

<div>



<p><span style="color: rgb(31, 73, 125);">OK, I now see the difference
between SameValue and StrictEquality.&nbsp; SameValue(NaN,NaN) is true and
StrictEquality(NaN,NaN) is false.&nbsp; Assuming that we really need this
distinction, rather than duplicating "code" I would define one in
terms of the other with an additional predicate to handle the NaN distinction.</span></p></div></div></blockquote><div>Yes. And StrictEquality(0, -0) is true whereas SameValue(0, -0) is false. (This is modulo a possible Word rendering error in the Kona draft. This difference on -0 is certainly what was intended, and what I sent to Pratap.) <br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p><span style="color: rgb(31, 73, 125);"> <br>
</span></p>

<p><span style="color: rgb(31, 73, 125);">I also think the SameValue name
is misleading as it is really just a StricterEquality test and not a identical
value test.&nbsp; This name confusion is probably what caused it to be edited into
[[DefineOwnPropety]].</span></p></div></div></blockquote><div>As DavidSarah says, SameValue *is* an identical value test. The only difference between === and an identical value test is NaN and -0, which are therefore called out as special cases in SameValue.<br>
<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p><span style="color: rgb(31, 73, 125);"></span></p>


<p><span style="color: rgb(31, 73, 125);">Finally, I understand the
thinking behind using SameValue in Array.prototypeindexOf and
Array.prototype.lastIndexOf but do we really want to introduce yet another
concept of "equality" into the language just to these
functions.&nbsp; If NaN comparision is a special case for these function might
not there be other special cases of user defined objects?&nbsp; To me, a better
design would be to add a optional third &nbsp;argument to those functions which
is a closure that provides the comparison function.&nbsp; That way the default
comparison could be === (or == if that makes more sense) and you would search
for a NaN by saying something like: [1,2,NaN,3].indexOf(NaN,0,function(x,y)
{return IsNaN(x)}).&nbsp; Of course, the first argument is not strictly necessary
in this formulation so an even cleaner alternative might me
findIndexOf(callbackfn [, fromIndex]) so you could express it as
[1,2,NaN,3].FindIndexOf(function(x,y) {return IsNaN(x)})</span></p></div></div></blockquote><div><br>There&#39;s some sense to adding a third argument, but let&#39;s not try to squeeze that into ES3.1. In its absence, the default should SameValue, not StrictEquality. These are operations on collections, and should be consistent with the behavior we expect to specify for future containers, specifically Maps. <br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p><span style="color: rgb(31, 73, 125);"> <br>
</span></p>

<p><span style="color: rgb(31, 73, 125);">So, what do the "in the
wild" implementations of indexOf do?&nbsp; Do they do a === comparison or
do they do the equivalent of the proposed SameValue function?</span></p></div></div></blockquote></div>They do a === comparison. We have recently switched Caja&#39;s indexOf and lastIndexOf to SameValue. This change has not disrupted our attempts to port the Prototype and jQuery libraries onto Caja. Nor has it triggered any failures in their regression tests. To accumulate more data, I encourage all those in a position to test to add the following code to some relevant prelude:<br>
<br>(function(){<br><br>&nbsp; function identical(x, y) {<br>&nbsp;&nbsp;&nbsp; if (x === y) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 0 === -0, but they are not identical<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x !== 0 || 1/x === 1/y;<br>&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // NaN !== NaN, but they are identical<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return isNaN(x) &amp;&amp; isNaN(y);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br><br>&nbsp; Array.prototype.indexOf = function(specimen) {<br>&nbsp;&nbsp;&nbsp; var len = this.length;<br>&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; len; i += 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (identical(this[i], specimen)) {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp; };<br><br>&nbsp; Array.prototype.lastIndexOf = function(specimen) {<br>&nbsp;&nbsp;&nbsp; for (var i = this.length; --i &gt;= 0; ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (identical(this[i], specimen)) {<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp; };<br>})();<br clear="all"><font color="#888888"><br><br>Thanks.<br clear="all"></font><br>-- <br> &nbsp; &nbsp;Cheers,<br> &nbsp; &nbsp;--MarkM<br>