Indexed string pseudo properties and for-in, was RE: Comments on April ES5 final draft standard tc39-2009-025
On Mon, Apr 27, 2009 at 5:28 PM, Allen Wirfs-Brock <Allen.Wirfs-Brock at microsoft.com> wrote:
As currently specified, they are to be enumerated by for-in. This is intentional and I believe we discussed it at some past TC-39 meeting. If we are treating the string characters as indexible readonly properties then for-in-ing over them seems like a perfectly reasonable thing to do. This is one of the advantages of using [[GetOwnProperty]] in this manner rather than trying to support direct string indexing using some other specification mechanism -- they just naturally integrate into property access anywhere it occurs in the specification.
I'm happy with that, so long as it's consistent with the definition of for-in. However, the only relevant text I could find in for-in is
Let P be the name of the next property of obj whose [[Enumerable]] attribute is true. If there is no such property, return (normal, V, empty).
Since these indexes are not actually properties of strings, this text is insufficient.
You may be right, that an additional note is warranted. However, being in a contentious mood I'll also argue that these are indeed properties of string objects. If [GetOwnProperty] says P is a property that then it really is one. In other words: P is the name of a own property of O iff O.[GetOwnProperty] is not undefined that is pretty much exactly how Object.prototype.hasOwnProperty(V) is defined.
The hole in the spec. seems to be that a few places (for-in, Object.keys, etc.) we use informal language to enumerate an object's properties. We probably need a more formal definition that incorporates the above rule.
Allen
-----Original Message----- From: Mark S. Miller [mailto:erights at google.com] Sent: Monday, April 27, 2009 6:59 PM To: Allen Wirfs-Brock Cc: es5-discuss at mozilla.org; es-discuss at mozilla.org Subject: Re: Indexed string pseudo properties and for-in, was RE: Comments on April ES5 final draft standard tc39-2009-025
...
As currently specified, they are to be enumerated by for-in. This is intentional and I believe we discussed it at some past TC-39 meeting. If we are treating the string characters as indexible readonly properties then for-in-ing over them seems like a perfectly reasonable thing to do. This is one of the advantages of using [[GetOwnProperty]] in this manner rather than trying to support direct string indexing using some other specification mechanism -- they just naturally integrate into property access anywhere it occurs in the specification.