instanceof Operator

Lars T Hansen lth at acm.org
Sun Oct 21 11:34:46 PDT 2007


On 10/21/07, Jeff Dyer <jodyer at adobe.com> wrote:
>
> On 10/21/07 10:03 AM, liorean wrote:
>
> > On 21/10/2007, Eugen.Konkov at aldec.com <Eugen.Konkov at aldec.com> wrote:
> >> var a;
> >> a= {};
> >> a instanceof Object //true
> >> a= [];
> >> a instanceof Array //true
> >> a='asdf';
> >> a instanceof String //false
> >> a= 7;
> >> a instanceof Number //false
> >>
> >> Why?
> >
> > Because those are primitives of type double and string respectively.
> > They are not instances of any of the compound types Object, String or
> > Number.
> >
> > Something silly that JavaScript inherited from Java that the world
> > would be much better off without, but as I understand it won't be
> > corrected because of real world compatibility problems.
>
> This problem is fixed by the addition of the 'is' operator in ES4. Replace
> 'instanceof' with 'is' in all of the above, and the result will be true in
> each case. You correctly point out that 'instanceof' is terminally broken
> for compatibility's sake.

I don't think "is" fixes it, because "string" is not a subclass of
"String" (for compatibility reasons) and "abcd" is "string".  However,

"abcd" is string => true
"abcd" instanceof string => true

The wrapper classes String, Number, Boolean are similar to the
(primitive) values they wrap, but they're not really related to those
value types in a type sense, and in ES4 the wrappers are of even less
utility than in ES3, I would say.

--lars



More information about the Es4-discuss mailing list