I've looked at your fiddle. The following assignment in line 5:

        Symbol.iterator = Symbol('Symbol.iterator')

should fail (silently if you are not in strict mode), because the "iterator" 
property of the Symbol object is not writable.

Therefore, in the rest of the fiddle, `Symbol.iterator` should refer to the 
original @@iterator symbol, not to the replaced one.
(Your fiddle is a good illustration of why one should always run code in strict 
mode.)

But to answer to the specific question: the spec always uses the original 
@@iterator symbol, not the current value of `Symbol.iterator`.

—Claude

> Le 6 févr. 2015 à 10:19, Jordan Harband <[email protected]> a écrit :
> 
> Should a JS engine retain a reference to the original value of well-known 
> symbols (like Symbol.iterator), or should steps that use 
> well-known-Symbol-valued properties (like for..of iteration) always do a 
> dynamic lookup on that value?
> 
> http://jsfiddle.net/hzzo10dm/2/ <http://jsfiddle.net/hzzo10dm/2/> is a proof 
> of concept that demonstrates in Chrome 40 that by replacing Symbol.iterator 
> with another symbol, I can create some weird behavior.
> 
> What is specified to happen to built-in and custom iterables if I do 
> `Symbol.iterator = Symbol()`?
> 
> What I would expect is that either:
>  -  the original value of Symbol.iterator would forever be the only value in 
> a realm that could be used to provide an iterator
>  - or, that whatever the current value of Symbol.iterator, at that moment 
> that would be the only way to retrieve an iterator on an object, thus 
> overwriting Symbol.iterator should break all iteration.
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to