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 <[email protected]>
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 <[email protected]>
> Sent: Saturday, July 27, 2019 4:42 PM
> To: Michael Haufe <[email protected]>
> Cc: Jordan Harband <[email protected]>; [email protected]
> 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
> [email protected]
> www.isiahmeadows.com
>
>
> On Sat, Jul 27, 2019 at 5:20 PM Michael Haufe <[email protected]>
> 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 <[email protected]>
> > Sent: Saturday, July 27, 2019 3:56 PM
> > To: Michael Haufe <[email protected]>
> > Cc: [email protected]
> > 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 <[email protected]>
> 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 <[email protected]>
> > Sent: Saturday, July 27, 2019 3:00 PM
> > To: Michael Haufe <[email protected]>
> > Cc: ViliusCreator <[email protected]>;
> > [email protected]
> > 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 <[email protected]>
> 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 <[email protected]>
> > Sent: Saturday, July 27, 2019 2:04 PM
> > To: Michael Haufe <[email protected]>
> > Subject: RE: Proposal: Typeof Trap
> >
> >
> >
> > Yes, but it traps `typeof `, not `instanceof`. There’s difference there.
> >
> > _______________________________________________
> > 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
> _______________________________________________
> 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