|
View:
New views
14 Messages
—
Rating Filter:
Alert me
|
|
|
More string indexing semantics issuesAssuming the string index semantics I defined in my previous
message, what should the effect of setting a numeric property on a string whose
property name is a valid character position into the string? For example: var s = new String(“abc”) s[1]; /* not valid in ES3, should
yield “b” under extended semantics*/ s[1] = “x”; /*
valid in ES3, but has nothing to do with the string value */ s[1]; /* both in
ES3 and with extended semantics would yield “x” Should the assignment, s[1] = “x”, still be
valid in the present if we support string indexing? Argument for allowing: It’s backwards
compatible. There may be existing ES3 programs that depend upon it. Argument for disallowing: Allowing characters of a
string to be accessed using property access syntax makes the string elements
appear as if they are actually properties. There appears to be a “joining”
of s[1] and s.charAt[1}. My inclination would be to disallow, but preserving existing
code is one of our top priorities. What do the existing implementation that
support indexed access to string elements do? If some of them disallow defining
such properties then there is probably enough existing divergence that the compatibility
issue doesn’t really apply. Second issue: I defined string index property access in such a way that
such properties appear to be non-enumerable. Is this reasonable? It’s
inconsistent with arrays. However, saying that they are enumerable implies that
for-in should iterate over string element indexes which it now doesn’t
do. Also what about meta operations like Object.prototype.hasOwnProperty?
My current semantics would cause it report true for string element
indexes. Is this reasonable? It’s another set of incompatibilities. _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issues2008/6/24 Allen Wirfs-Brock <Allen.Wirfs-Brock@...>:
> Assuming the string index semantics I defined in my previous message, what > should the effect of setting a numeric property on a string whose property > name is a valid character position into the string? > > > > For example: > > var s = new String("abc") > > s[1]; /* not valid in ES3, should yield "b" under extended semantics*/ > > s[1] = "x"; /* valid in ES3, but has nothing to do with the string > value */ > > s[1]; /* both in ES3 and with extended semantics would yield "x" > > > > Should the assignment, s[1] = "x", still be valid in the present if we > support string indexing? > > > > Argument for allowing: It's backwards compatible. There may be existing > ES3 programs that depend upon it. > > > > Argument for disallowing: Allowing characters of a string to be accessed > using property access syntax makes the string elements appear as if they are > actually properties. There appears to be a "joining" of s[1] and > s.charAt[1}. > Since the value of a string is immutable, any property that is "joined" to a > an element of a string value should be a read-only property. > > > > My inclination would be to disallow, but preserving existing code is one of > our top priorities. What do the existing implementation that support indexed > access to string elements do? If some of them disallow defining such > properties then there is probably enough existing divergence that the > compatibility issue doesn't really apply. > > Webkit seems to have implemented a specialized [[Put]] for strings. When the property is numeric, the property setting fails silently. This can be observed by an example:- javascript:(function(){var a = new String("Alan"); a[0] = "E"; alert(a[0]); })(); FF2: "E" Sf3: "A" OP9: "E" IE7: "E" It seems to me that Webkit's behavior is a bug. This is something that I blogged about last year. http://dhtmlkitchen.com/?category=/JavaScript/&date=2007/10/21/&entry=Iteration-Enumeration-Primitives-and-Objects#magic-string-source > > Second issue: > > I defined string index property access in such a way that such properties > appear to be non-enumerable. Is this reasonable? It's inconsistent with > arrays. However, saying that they are enumerable implies that for-in should > iterate over string element indexes which it now doesn't do. Also what > about meta operations like Object.prototype.hasOwnProperty? My current > semantics would cause it report true for string element indexes. Is this > reasonable? It's another set of incompatibilities. > > It seems that nobody should be using a for in loop on a String or SV. String.prototype.trim = ... Would be an obvious reason. Using hasOwnProperty might be a consideration, but why would anyone want to? Garrett _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Jun 24, 2008, at 11:45 PM, Garrett Smith wrote: > > Webkit seems to have implemented a specialized [[Put]] for strings. > When the property is numeric, the property setting fails silently. > This can be observed by an example:- > > javascript:(function(){var a = new String("Alan"); a[0] = "E"; > alert(a[0]); })(); > > FF2: "E" > Sf3: "A" > OP9: "E" > IE7: "E" > > It seems to me that Webkit's behavior is a bug. We could easily change this, but why do you think the behavior is a bug (other than not matching Firefox)? Your blog post did not state a reason either. My expectation would be that numeric index properties of a String object are read-only, much like the length property. For example, the following gives 3 in both Safari and Firefox: <script> var s = new String("abc"); s.length = 55; alert(s.length); </script> Regards, Maciej _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
RE: More string indexing semantics issuesGarrent: Thanks for the pointer to your analysis. Do you have any others that identify issues that could potentially be fixed in ES3.1?
I think in this case I have to agree with Maciej...Webkit appears to be doing the "right thing" by making a string appear to consistently have a set of numerically named readonly properties that exactly correspond to the elements of the string value. In a clean-slate world, I think that should be the end of the discussion. However, we have backwards compatibility issues to consider. By the book ES3 allows numerically named properties to be added to String objects that are unrelated to the string value, and 2 out of the 3 widely used browser-based implementations that support property style access to the string value also allow such properties to be added. Only Webkit deviates from this. Right or wrong, from a pure compatibility perspective preserving that capability would be important **if we think that there is any significant usage of it**. The fact that Safari seems to be getting away with its implementation without being badgered into conformance suggests that there probably isn't any such significant usage. So, unless someone has some evidence that it is going to "break the web" I'm going to leave by ES3.1 specification the way it currently is written, which implements the observed behavior of Webkit. Maciej: I assume you haven't heard of any significant web content being broken by this behavior. Garrett: Do you know of anything other than your test case that would be impacted if the standard adopted the Webkit behavior? _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn 25/06/2008, Allen Wirfs-Brock <Allen.Wirfs-Brock@...> wrote:
> I think in this case I have to agree with Maciej...Webkit appears to be doing the "right thing" by making a string appear to consistently have a set of numerically named readonly properties that exactly correspond to the elements of the string value. Well, the way I think about String objects and strings: - A string can't have properties of it's own at all, i.e. can be thought of as having a noop setter and a custom getter for indices and length. Any property not found by the getter should get delegated to String.prototype. - A String object is just a normal object delegating to a string. (Could probably reuse the [[Prototype]] internal property if implemented that way...) Thus, any properties set are placed on the wrapper object and would as a result of that shadow the getter and setter on the string. > In a clean-slate world, I think that should be the end of the discussion. However, we have backwards compatibility issues to consider. By the book ES3 allows numerically named properties to be added to String objects that are unrelated to the string value, and 2 out of the 3 widely used browser-based implementations that support property style access to the string value also allow such properties to be added. Only Webkit deviates from this. Right or wrong, from a pure compatibility perspective preserving that capability would be important **if we think that there is any significant usage of it**. I expect almost all usage of "new String" to be from people who either come from Java or who have not learnt JavaScript beyond the rookie stage yet. And maybe one or two library writers who are too clever for their own good... > The fact that Safari seems to be getting away with its implementation without being badgered into conformance suggests that there probably isn't any such significant usage. Neither the direct access of characters in the string by indiced property lookup nor the use of String objects is common, so the overlap is in all probability diminutive. -- David "liorean" Andersson _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Jun 25, 2008, at 9:37 AM, Allen Wirfs-Brock wrote:
> I think in this case I have to agree with Maciej...Webkit appears > to be doing the "right thing" by making a string appear to > consistently have a set of numerically named readonly properties > that exactly correspond to the elements of the string value. IIRC, we intentionally allowed overriding indexed properties to be set on String objects, for backward compatibility. So, we chickened out. Minority share browsers facing a rare use-case conflicting with an extension sometimes do that. It's hard to know when getting away with something in such a setting means you can continue to get away clean, never mind whether a new version of the standard should codify the minority behavior. > In a clean-slate world, I think that should be the end of the > discussion. However, we have backwards compatibility issues to > consider. By the book ES3 allows numerically named properties to > be added to String objects that are unrelated to the string value, > and 2 out of the 3 widely used browser-based implementations that > support property style access to the string value also allow such > properties to be added. Only Webkit deviates from this. Right or > wrong, from a pure compatibility perspective preserving that > capability would be important **if we think that there is any > significant usage of it**. The fact that Safari seems to be > getting away with its implementation without being badgered into > conformance suggests that there probably isn't any such significant > usage. Probably. But we don't know enough. > So, unless someone has some evidence that it is going to "break the > web" I'm going to leave by ES3.1 specification the way it currently > is written, which implements the observed behavior of Webkit. This isn't the only way to proceed. Changing a pre-release, but widely used, Firefox build to match Safari would help. Changing IE beta-next as well would help even more. None of this would be decisive, but it would trump any assertions we can make today. Again I am concerned with making an ES3.1 with zero implementations before the standard is finalized. /be _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Wed, Jun 25, 2008 at 3:15 PM, liorean <liorean@...> wrote:
> On 25/06/2008, Allen Wirfs-Brock <Allen.Wirfs-Brock@...> wrote: >> I think in this case I have to agree with Maciej...Webkit appears to be doing the "right thing" by making a string appear to consistently have a set of numerically named readonly properties that exactly correspond to the elements of the string value. > > Well, the way I think about String objects and strings: > - A string can't have properties of it's own at all, i.e. can be > thought of as having a noop setter and a custom getter for indices and > length. Any property not found by the getter should get delegated to > String.prototype. > - A String object is just a normal object delegating to a string. > (Could probably reuse the [[Prototype]] internal property if > implemented that way...) Thus, any properties set are placed on the > wrapper object and would as a result of that shadow the getter and > setter on the string. That's not how they work today, though, at least as far as the .length property goes: js> s = new String("foo") foo js> s.length 3 js> s.length = 5 5 js> s.length 3 js> And of course it has to delegate to an object that has all the right methods on it. Are "numerically-named" properties >= length settable? > Neither the direct access of characters in the string by indiced > property lookup nor the use of String objects is common, so the > overlap is in all probability diminutive. Direct use of characters is pretty common, I think, but you sound like you are stating fact rather than opinion, so I'm prepared to be swayed by your data. String objects are very commonly created[*], by people calling methods or accessing properties like .length on string primitives. [*] we optimize the object creation away there for built-ins, and I believe that WebKit is about to do the same thing, but that doesn't -- can't! -- affect the semantics of object creation, and the relationship to String.prototype. Mike _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issues> On Wed, Jun 25, 2008 at 3:15 PM, liorean <liorean@...> wrote:
> > Well, the way I think about String objects and strings: > > - A string can't have properties of it's own at all, i.e. can be > > thought of as having a noop setter and a custom getter for indices and > > length. Any property not found by the getter should get delegated to > > String.prototype. > > - A String object is just a normal object delegating to a string. > > (Could probably reuse the [[Prototype]] internal property if > > implemented that way...) Thus, any properties set are placed on the > > wrapper object and would as a result of that shadow the getter and > > setter on the string. > > > That's not how they work today, though, at least as far as the .length > property goes: > > js> s = new String("foo") > foo > js> s.length > 3 > js> s.length = 5 > 5 > js> s.length > 3 > js> > > And of course it has to delegate to an object that has all the right > methods on it. Yes, I had thought of that too, but then I had already pressed the send button... > Are "numerically-named" properties >= length settable? In saf3.1.1, ff3.0 and op9.50 they are, yes. > > Neither the direct access of characters in the string by indiced > > property lookup nor the use of String objects is common, so the > > overlap is in all probability diminutive. > > Direct use of characters is pretty common, I think, but you sound like > you are stating fact rather than opinion, so I'm prepared to be swayed > by your data. String objects are very commonly created[*], by people > calling methods or accessing properties like .length on string > primitives. I'm not stating that from any collected data, no. It was purely based on three things: - The only scripts I have seen using it both happen to be made by advanced coders and happen to not have IE in their target audience for some reason (extension, widget, greasemonkey script, userjs, bookmarklet for some specific browser etc.). - IE does not support it so logically it wouldn't be present in very much code on the web. - I can't recall ever seeing anybody on a forum or a mailing list actually having a problem related to use of index lookup directly on strings. And I'm sure that if it was common outside the developers that do not have IE in their target audience at all, then there would be people having trouble with it. Also, while String objects are created as temporaries when looking up a property on a string, how many of those properties or methods actually return a String object? The only situation I can think of off the top of my head where you're going to actually have a String object to deal with in ES3 is if you're extending the String.prototype object with new methods. > [*] we optimize the object creation away there for built-ins, and I > believe that WebKit is about to do the same thing, but that doesn't -- > can't! -- affect the semantics of object creation, and the > relationship to String.prototype. Yes, I know my way of looking at it is not quite what is happening. But for a script writer, it's a good enough model of thought about the relation between the primitive and compound objects. -- David "liorean" Andersson _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn 25/06/2008, liorean <liorean@...> wrote:
> Also, while String objects are created as temporaries when looking up > a property on a string, how many of those properties or methods > actually return a String object? The only situation I can think of off > the top of my head where you're going to actually have a String object > to deal with in ES3 is if you're extending the String.prototype object > with new methods. A distinction I was going to make there fell away when I rewrote an awkward formulation... s/String object to deal with/String object that you haven't explicitly created using "new String" to deal with/ -- David "liorean" Andersson _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Jun 25, 2008, at 9:37 AM, Allen Wirfs-Brock wrote: > Garrent: Thanks for the pointer to your analysis. Do you have any > others that identify issues that could potentially be fixed in ES3.1? > > > I think in this case I have to agree with Maciej...Webkit appears to > be doing the "right thing" by making a string appear to consistently > have a set of numerically named readonly properties that exactly > correspond to the elements of the string value. > > In a clean-slate world, I think that should be the end of the > discussion. However, we have backwards compatibility issues to > consider. By the book ES3 allows numerically named properties to be > added to String objects that are unrelated to the string value, and > 2 out of the 3 widely used browser-based implementations that > support property style access to the string value also allow such > properties to be added. Only Webkit deviates from this. Right or > wrong, from a pure compatibility perspective preserving that > capability would be important **if we think that there is any > significant usage of it**. The fact that Safari seems to be getting > away with its implementation without being badgered into conformance > suggests that there probably isn't any such significant usage. > > So, unless someone has some evidence that it is going to "break the > web" I'm going to leave by ES3.1 specification the way it currently > is written, which implements the observed behavior of Webkit. > > Maciej: I assume you haven't heard of any significant web content > being broken by this behavior. I have not seen any reports of such problems. If it were common to put random numeric properties on String objects, I expect we would have had a bug report by now. Regards, Maciej _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Wed, Jun 25, 2008 at 1:52 PM, Maciej Stachowiak <mjs@...> wrote:
> > On Jun 25, 2008, at 9:37 AM, Allen Wirfs-Brock wrote: > >> Garrent: It's Garrett, BTW. > > I have not seen any reports of such problems. If it were common to put > random numeric properties on String objects, I expect we would have had a > bug report by now. > Why? Do you are there many Webkit only applications? Do these applications take advantage of string indexing via property access? > Regards, > Maciej > > _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
|
|
|
Re: More string indexing semantics issuesOn Jun 25, 2008, at 4:00 PM, Garrett Smith wrote: > >> In spec terms, WebKit's behavior can be explained in >> terms of strings having additional DontDelete ReadOnly properties. > > Let me get this straight: > > Webkit's behavior can be explained in terms of String objects having > additional properties with numeric names and the attributes > {DontDelete ReadOnly} > > Is that what you meant? Yes. >> The >> Mozilla behavior can be explained as strings having those same >> additional >> properties, but they are not ReadOnly. In both cases, index >> properties past >> the last character do not exist ahead of time. >> > > My observations indicate otherwise. Webkit does not appear to create > additional properties to String objects. > > javascript:alert(Object("foo").hasOwnProperty(0)); > > > FF2 - true > Sf3 - false > Op9 - false > > Where does the "0" property exist, Maciej? Is this bug related to > hasOwnProperty? I just tried this in Safari 3.1 and Safari alerted true. The same happens in WebKit trunk. If it alerted false I would say that is a bug. > It appears to me that Mozilla and Opera and Webkit all implement a > specialized [[Get]], where Opera and Mozilla do: > > 1) Look for property P on String object. > 2) Look for String instance charAt( P ) > 3) Look in String prototype. > > Webkit does:- > 1) Look for String instance charAt( P ) > 2) Call the[[Get]] method on S with argument P. You could model it in many ways. I have not looked at Mozilla's or Opera's actual implementations. What I am saying is that Safari/WebKit tries to publicly present the logical model that these are ReadOnly DontDelete properties. How it's actually implemented isn't really relevant. In WebKit's implementation we implement all sorts of JS properties internally in ways other than putting them in the generic object property map. It is true that in spec-speak you could define it as special [[Get]] and [[Put]] behavior (and other operations like [[Delete]] and [[HasOwnProperty]]) instead of special properties. > javascript:var f = Object("1234567");void(String.prototype[0] = "0"); > void(f[0] = "8"); alert(f[0]); > > "8" in Opera9 and FF2. > "0" in Saf3. > > In Opera, the object doesn't have numeric properties, and only appears > to have special [[Get]]:- > javascript:alert("0" in Object("foo")); > javascript:alert(Object("foo")[0]); > > Op9 - false and "f" > FF2 - true and "f" > > Mozilla has the properties on the object and Opera doesn't. > > (this explains why - Object("foo").hasOwnProperty(0) - is false in > Opera. > >> The reason for the way WebKit does things, for what it's worth, is >> because >> index properties of the string are checked first before normal >> properties >> (because they can't be overwritten), so "abc"[1] can be as fast as >> an array >> access instead of going at the speed of normal property access. >> > > So the [[Put]] method on a String instance is different in Webkit. What I am talking about above is the equivalent of the spec's [[Get]], not [[Put]]. The specialization I describe is for performance, and behaviorally transparent. However, our JavaScript implementation doesn't have things that correspond exactly to the spec's [[Get]] and [[Put]] formalisms. Regards, Maciej _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
|
|
Re: More string indexing semantics issuesOn Jun 25, 2008, at 2:33 PM, Garrett Smith wrote: > On Wed, Jun 25, 2008 at 1:52 PM, Maciej Stachowiak <mjs@...> > wrote: >> >> I have not seen any reports of such problems. If it were common to >> put >> random numeric properties on String objects, I expect we would have >> had a >> bug report by now. >> > > Why? What I meant is this: 1) When Safari/WebKit/JavaScriptCore diverges from other browsers in JavaScript behavior, in ways that Web content depends on, we have historically gotten bug reports even when the issue is very obscure. See my earlier comments about things like function declarations in statement position for examples. 2) We have not gotten bug reports that involve a site breaking because it set a low numeric property on a String object, and did not get the expected value back. At least, none have been found to have this as the cause. In other words, we have not seen cases like this: var s = new String("abc"); s[0] = "expected"; if (s[0] != "expected") alert("EPIC FAIL"); 3) Therefore, I think it is unlikely that a lot of public Web content depends on being able to do this. If this were at all common, odds are that we would have heard about it by now. As Brendan suggests, deploying the behavior in beta versions of other browsers would give us more data points. > Do you are there many Webkit only applications? Do these > applications take advantage of string indexing via property access? I do not think the existence of WebKit-only applications is relevant. There are in fact a fair number (for example Dashboard widgets and iPhone-specific Web apps), but they do not tell us anything about whether public Web content at large depends on the behavior of allowing any numeric property of a String object to be successfully assigned. (I do not think any of this content depends on the WebKit behavior either). Regards, Maciej _______________________________________________ Es4-discuss mailing list Es4-discuss@... https://mail.mozilla.org/listinfo/es4-discuss |
| Free Forum Powered by Nabble | Forum Help |