<div dir="ltr">AFAIK that's also what Allen said didn't want to implement in core. An expensive operation per each invocation due stateless loop over arbitrary indexes.<div><br></div><div>Although, strings are immutable in JS so I'd implement that logic creating a snapshot once and use that as if it was an Array ... something like the following:</div>
<div><br></div><div>```javascript</div><div><br></div><div><div>!function(dict){</div><div><br></div><div>  function getOrCreate(str) {</div><div>    if (!(str in dict)) {</div><div>      dict[str] = {</div><div>        i: 0,</div>
<div>        l: 0,</div><div>        v: (Array.from || function(){</div><div>          // miserable callback</div><div>          return str.split('')</div><div>        })(str)</div><div>        // or the for/of loop</div>
<div>      };</div><div>    }</div><div>    // times it's used</div><div>    dict[str].i++;</div><div>    return dict[str].v;</div><div>  }</div><div><br></div><div>  setInterval(function () {</div><div>    var key, value;</div>
<div>    for(key in dict) {</div><div>      value = dict[key];</div><div>      value.l = value.i - value.l;</div><div>      // used only once or never used again</div><div>      if (value.l < 2) {</div><div>        // free all the RAM</div>
<div>        delete dict[key];</div><div>      }</div><div>    }</div><div>  }, 5000); // 5 seconds should be enough ?</div><div>            // incremental works better with</div><div>            // slower timeout though</div>
<div>            // 500 might be good too</div><div><br></div><div>  Object.defineProperties(</div><div>    String.prototype,</div><div>    {</div><div>      at: {</div><div>        configurable: true,</div><div>        writable: true,</div>
<div>        value: function at(i) {</div><div>          return getOrCreate(this)[i];</div><div>        }</div><div>      },</div><div>      // or any meaningful name</div><div>      size: {</div><div>        configurable: true,</div>
<div>        get: function () {</div><div>          return getOrCreate(this).length;</div><div>        }</div><div>      }</div><div>    }</div><div>  );</div><div><br></div><div>}(Object.create(null));</div><div><br></div>
<div><br></div><div>// @example</div><div>var str = 'abc';</div><div>alert([</div><div>  str.size, // 3</div><div>  <a href="http://str.at">str.at</a>(1) // b</div><div>]);</div></div><div><br></div><div><br></div>
<div>```</div><div><br></div><div>Regards</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Oct 19, 2013 at 10:54 AM, Domenic Denicola <span dir="ltr"><<a href="mailto:domenic@domenicdenicola.com" target="_blank">domenic@domenicdenicola.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Mathias Bynens [mailto:<a href="mailto:mathias@qiwi.be">mathias@qiwi.be</a>]<br>
<div class="im"><br>
<br>
> This brings us back to the earlier discussion of whether something like `String.prototype.codePoints` should be added: <a href="http://esdiscuss.org/topic/how-to-count-the-number-of-symbols-in-a-string" target="_blank">http://esdiscuss.org/topic/how-to-count-the-number-of-symbols-in-a-string</a> It could be a getter or a generator… Or does `for…of` iteration handle this use case adequately?<br>

<br>
</div>It sounds like you are proposing a second name for `String.prototype[Symbol.iterator]`, which does not sound very useful.<br>
<br>
A property for the string's "real length" does seem somewhat useful, as does a method that does random-access on "real characters." Certainly more useful than the proposed symbolAt/at. But I suppose we can pave whatever cowpaths arise.<br>

<br>
My proposed cowpaths:<br>
<br>
```js<br>
Object.mixin(String.prototype, {<br>
  realCharacterAt(i) {<br>
    let index = 0;<br>
    for (var c of this) {<br>
      if (index++ === i) {<br>
        return c;<br>
      }<br>
    }<br>
  }<br>
  get realLength() {<br>
    let counter = 0;<br>
    for (var c of this) {<br>
      ++counter;<br>
    }<br>
    return counter;<br>
  }<br>
});<br>
```<br>
<br>
This would allow you to e.g. find the character in the "real" middle of a string with code like<br>
<br>
```js<br>
var middleIndex = Math.floor(theString.realLength / 2);<br>
var middleRealCharacter = theString.realCharacterAt(middleIndex);<br>
```<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>