Have you...read Annex B? It's not as large as you might think.

It's worth noting `let[x] = [1]` *was* successfully changed from
setting `let[x]` to `1` to setting `x` to `1`, without breaking the
Web. (ES5 code didn't and couldn't change
`Array.prototype[Symbol.iterator]`.) About the only major additions I
can think of that had to be renamed were `Array.prototype.flat` (many
libraries implemented an incompatible `flatten` method) and
`Array.prototype.includes` (Mootools implemented
`Array.prototype.contains` differently and it broke a lot of users on
old versions of it who wouldn't migrate).

-----

Isiah Meadows
cont...@isiahmeadows.com
www.isiahmeadows.com

On Sun, Jul 28, 2019 at 10:46 PM Ranando King <king...@gmail.com> wrote:
>
> On one hand, I agree with Jordan. Don't grief the language due to a bad 3rd 
> party API. Whether we accept it or not, a browser's API is a 3rd party API 
> with respect to Javascript. Otherwise, node would have to include that API to 
> be spec compliant.
>
> On the other hand, let's be a little more pragmatic about it. If that 
> busted-up Web API wasn't important, ES wouldn't be so highly constrained in 
> its changes vs what's running in browsers.
>
> On Sun, Jul 28, 2019 at 1:10 AM Jordan Harband <ljh...@gmail.com> wrote:
>>
>> The existence of `document.all` (which is now specified in Annex B of the JS 
>> spec) doesn't make `typeof` broken, it makes web browsers broken.
>>
>> On Sat, Jul 27, 2019 at 3:42 PM Michael Haufe <t...@thenewobjective.com> 
>> wrote:
>>>
>>> Congratz. It was document.all.
>>>
>>> "In case you're wondering, I've never seen anyone return or store 
>>> `document.all` ever."
>>>
>>> Before W3C standard you could (and some people did):
>>>
>>> function elements() {
>>>     if(document.all) {
>>>         return document.all
>>>     } else if(document.layers) {
>>>         return document.layers
>>>     } else {
>>>         throw "You must use IE4+ or NS 4.7!"
>>>     }
>>> }
>>>
>>> This is actually the wrong way to use document.layers, but it was not 
>>> uncommon to see. Later when the W3C was standardizing, you managed the 
>>> three pathways by passing the id to the function.
>>>
>>> You can see examples of this on comp.lang.javascript, and through a search 
>>> engine by looking for "return document.all" or "return document.layers". 
>>> There are also some legacy books showing the practice.
>>>
>>> /Michael
>>>
>>>
>>> -----Original Message-----
>>> From: Isiah Meadows <isiahmead...@gmail.com>
>>> Sent: Saturday, July 27, 2019 4:42 PM
>>> To: Michael Haufe <t...@thenewobjective.com>
>>> Cc: Jordan Harband <ljh...@gmail.com>; es-discuss@mozilla.org
>>> Subject: Re: Proposal: Typeof Trap
>>>
>>> `document.all`, and that's only required for web browsers to implement
>>> - it's in Annex B. Some newer JS engines targeting non-browser platforms 
>>> (like Moddable's XS and I believe Nashorn as well) don't even implement it, 
>>> and it leads to a slightly simpler runtime.
>>>
>>> And it's only there thanks to a bunch of people relying on `if
>>> (document.all) doSomething()` for detecting legacy crap while others at the 
>>> same time just assuming it's there without checking for it first, almost 
>>> always on ancient web pages. Oh, and people were also calling it via 
>>> `document.all(nameOrIndex)` instead of `document.all[nameOrIndex]`, so the 
>>> HTML spec also has it implementing `[[Call]]`.
>>>
>>> - HTML spec: 
>>> https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#the-htmlallcollection-interface
>>> - ES spec: https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
>>>
>>> In case you're wondering, I've never seen anyone return or store 
>>> `document.all` ever.
>>>
>>> -----
>>>
>>> Isiah Meadows
>>> cont...@isiahmeadows.com
>>> www.isiahmeadows.com
>>>
>>>
>>> On Sat, Jul 27, 2019 at 5:20 PM Michael Haufe <t...@thenewobjective.com> 
>>> wrote:
>>> >
>>> > More than one case:
>>> >
>>> >
>>> >
>>> > <script>
>>> >
>>> > var foo = f()
>>> >
>>> > typeof foo // object
>>> >
>>> > foo instanceof Object // false
>>> >
>>> >
>>> >
>>> > var bar = g()
>>> >
>>> > typeof bar //undefined
>>> >
>>> > bar instanceof Object //true
>>> >
>>> > bar() //
>>> >
>>> > </script>
>>> >
>>> >
>>> >
>>> > You could probably guess what the value of foo is. Can you guess what the 
>>> > second is in any useful way?
>>> >
>>> >
>>> >
>>> > From: Jordan Harband <ljh...@gmail.com>
>>> > Sent: Saturday, July 27, 2019 3:56 PM
>>> > To: Michael Haufe <t...@thenewobjective.com>
>>> > Cc: es-discuss@mozilla.org
>>> > Subject: Re: Proposal: Typeof Trap
>>> >
>>> >
>>> >
>>> > With something that while unintuitive in one case, is eternally robust 
>>> > and reliable.
>>> >
>>> >
>>> >
>>> > If you want extensibility, define Symbol.toStringTag on your objects.
>>> >
>>> >
>>> >
>>> > On Sat, Jul 27, 2019 at 1:23 PM Michael Haufe <t...@thenewobjective.com> 
>>> > wrote:
>>> >
>>> > If it's unfixably broken[1], non-extensible, excessively vague, and 
>>> > non-orthogonal, where does that leave you?
>>> >
>>> >
>>> >
>>> > [1] <https://twitter.com/BrendanEich/status/798317702775324672>
>>> >
>>> >
>>> >
>>> > From: Jordan Harband <ljh...@gmail.com>
>>> > Sent: Saturday, July 27, 2019 3:00 PM
>>> > To: Michael Haufe <t...@thenewobjective.com>
>>> > Cc: ViliusCreator <viliuskubilius...@gmail.com>;
>>> > es-discuss@mozilla.org
>>> > Subject: Re: Proposal: Typeof Trap
>>> >
>>> >
>>> >
>>> > Those two PRs are about removing implementation-defined behavior from 
>>> > `typeof`, making it *more* reliable - there is no trend away from using 
>>> > and relying on `typeof`, full stop.
>>> >
>>> >
>>> >
>>> > `Symbol.hasInstance` is a part of why `instanceof` is actually unreliable 
>>> > - because user code can hook into it. It would be a massive loss imo if 
>>> > `typeof` lost its bulletproof status by adding a user hook.
>>> >
>>> >
>>> >
>>> > On Sat, Jul 27, 2019 at 12:37 PM Michael Haufe <t...@thenewobjective.com> 
>>> > wrote:
>>> >
>>> > The trend seems to be to rely on typeof less and less as time passes:
>>> >
>>> >
>>> >
>>> > From the  March 2019 Agenda 
>>> > <https://github.com/tc39/agendas/blob/274e49412c09f81a0a82f386e6eead481c69adad/2019/03.md>:
>>> >
>>> >
>>> >
>>> > “Implementation-defined typeof still necessary?”
>>> > <https://github.com/tc39/ecma262/issues/1440>
>>> >
>>> > “Normative: Remove implementation-defined typeof behavior”
>>> > <https://github.com/tc39/ecma262/pull/1441>
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > The only real discussion around this I can find is from a related 
>>> > proposal from Brendan Eich a few years ago:
>>> >
>>> >
>>> >
>>> > https://esdiscuss.org/topic/typeof-extensibility-building-on-my-value-
>>> > objects-slides-from-thursday-s-tc39-meeting
>>> >
>>> >
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > From: ViliusCreator <viliuskubilius...@gmail.com>
>>> > Sent: Saturday, July 27, 2019 2:04 PM
>>> > To: Michael Haufe <t...@thenewobjective.com>
>>> > Subject: RE: Proposal: Typeof Trap
>>> >
>>> >
>>> >
>>> > Yes, but it traps `typeof `, not `instanceof`. There’s difference there.
>>> >
>>> > _______________________________________________
>>> > es-discuss mailing list
>>> > es-discuss@mozilla.org
>>> > https://mail.mozilla.org/listinfo/es-discuss
>>> >
>>> > _______________________________________________
>>> > es-discuss mailing list
>>> > es-discuss@mozilla.org
>>> > https://mail.mozilla.org/listinfo/es-discuss
>>> _______________________________________________
>>> es-discuss mailing list
>>> es-discuss@mozilla.org
>>> https://mail.mozilla.org/listinfo/es-discuss
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to