<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:Z="urn:schemas-microsoft-com:" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
 /* List Definitions */
 @list l0
        {mso-list-id:442069069;
        mso-list-type:simple;
        mso-list-template-ids:67698703;}
@list l0:level1
        {mso-level-tab-stop:.25in;
        mso-level-number-position:left;
        margin-left:.25in;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='color:#1F497D'>A slightly revised (last two
steps) version of the pseudo-code:<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><b><span lang=EN-GB style='color:#1F497D'>15.5.5.2
[[GetOwnProperty]] (P)<o:p></o:p></span></b></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>String objects use a
variation of the [[GetOwnProperty]] method used for other native ECMAScript
objects (8.6.2.1.2).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>Assume <i>S </i>is a
String object and <i>P</i> is a string.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>When the
[[GetOwnProperty]] method of <i>S</i> is called with property name <i>P</i>,
the following steps are taken:<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>1.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Call the default [[GetOwnProperty]] method
(8.6.2.1.2) with <i>S</i> as the this value and argument P.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>2.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>If Result(1) is not <b>undefined</b> return
Result(1). <o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>3.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>If<i> P</i> is not an array index (15.4) ,
return <b>undefined</b>.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>4.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Call ToString, giving <i>S</i> as its
argument.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>5.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Call ToInteger(<i>P</i>).<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>6.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Compute the number of characters in Result(4).<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>7.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>If Result(5) is less than 0 or is not less
than Result(4), return <b>undefined</b>.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>8.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Create a string of length 1, containing one
character from Result(4), namely the character at position Result(5), where the
first (leftmost) character in Result(4) is considered to be at position 0, the
next one at position 1, and so on.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB style='color:#1F497D'><span style='mso-list:Ignore'>9.<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><![endif]><span
lang=EN-GB style='color:#1F497D'>Return a DDesc with attributes {[[Value]]:
Result(8), [[Enumerable]]: false, [[Writeable]]: false, [[Dynamic]]: false]<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
es4-discuss-bounces@mozilla.org [mailto:es4-discuss-bounces@mozilla.org] <b>On
Behalf Of </b>Allen Wirfs-Brock<br>
<b>Sent:</b> Tuesday, June 24, 2008 5:46 PM<br>
<b>To:</b> es3.x-discuss@mozilla.org; Pratap Lakshman (VJ#SDK)<br>
<b>Cc:</b> es4-discuss@mozilla.org<br>
<b>Subject:</b> Semantics of &quot;indexed&quot; string access<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I&#8217;ve taken a crack at cleaning up Pratap&#8217;s initial
specification for supporting direct indexing of strings, eg &#8220;abc&#8221;[1] yields &#8220;b&#8221;<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Here are the semantics that seemed to make sense:<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>s[n]<o:p></o:p></p>

<p class=MsoNormal>1) &nbsp;If s has an own property whose name is the same as
the value of n, the value of that property is returned.<o:p></o:p></p>

<p class=MsoNormal>2) else If the value of n is convertible to a number that is
within the bounds of the string value, return a string containing the
corresponding character<o:p></o:p></p>

<p class=MsoNormal>3) else if try to resolve n as the name of an inherited property<o:p></o:p></p>

<p class=MsoNormal>4) else return undefined.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>In other words, indexing into a string with a &#8220;valid&#8221; index
returns that appropriate character unless somebody has explicitly defined a
property named by that index on the object.<o:p></o:p></p>

<p class=MsoNormal>If the &#8220;index&#8221; is not within the bounds of the string it is
treated like a normal property access &#8211; If it isn&#8217;t defined either locally or
on the parent chain the result is undefined.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I&#8217;ve specified this by &#8220;over-riding&#8221; the definition of
[[GetOwnProperty]] for string instances&#8221;.&nbsp; Note that literal strings as in
the example above will have been transformed into objects by the property
access semantics of 11.2.1<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><b><span lang=EN-GB>15.5.5.2 [[GetOwnProperty]] (P)<o:p></o:p></span></b></p>

<p class=MsoNormal><span lang=EN-GB>String objects use a variation of the
[[GetOwnProperty]] method used for other native ECMAScript objects (8.6.2.1.2).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>Assume <i>S </i>is a String object and <i>P</i>
is a string.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>When the [[GetOwnProperty]] method of <i>S</i>
is called with property name <i>P</i>, the following steps are taken:<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>10.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>Call the default
[[GetOwnProperty]] method (8.6.2.1.2) with <i>S</i> as the this value and
argument P.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>11.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>If Result(1) is not <b>undefined</b>
return Result(1). <o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>12.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>If<i> P</i> is not an array
index (15.4) , return <b>undefined</b>.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>13.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>Call ToString, giving <i>S</i>
as its argument.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>14.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>Call ToInteger(<i>P</i>).<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>15.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>Compute the number of
characters in Result(4).<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>16.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>If Result(5) is less than 0 or
is not less than Result(4), return <b>undefined</b>.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
lang=EN-GB><span style='mso-list:Ignore'>17.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-GB>Return a string of length 1,
containing one character from Result(4), namely the character at position
Result(5), where the first (leftmost) character in Result(4) is considered to be
at position 0, the next one at position 1, and so on.<o:p></o:p></span></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Is this a reasonable semantics? Does it match what browsers
have already implemented?<o:p></o:p></p>

</div>

</body>

</html>