On May 10, 2012, at 1:08 AM, Axel Rauschmayer wrote:

>>> Are we going to have RegExp.isRegExp() and Date.isDate() and 
>>> Number.isNumber() etc. too ?
>> 
>> I did wince a bit about ES5's Array.isArray -- perhaps since it takes any x 
>> and tells whether x is an Array (from any window or frame) instance, it 
>> should have gone on object. You're right that the instanceof limitation 
>> motivating Array.isArray applies to these and other built-in "classes" as 
>> well.
>> 
>> Do we just add 'em all, or try to add only the ones for which we have enough 
>> experience to hope we're actually helping developers? How many times have 
>> you wanted RegExp.isRegExp, say? The belief is that testing for array-ness 
>> is more common. I don't have data, though, so I'm uncomfortable with any 
>> "need-based" approach.
>> 
>> Adding lots of predicates is straightforward, but then the dialectic 
>> requires us to wince at the sheer number of predicates (and the redundant 
>> name stems), and try for something like what Axel suggested: a do-it-all 
>> "type" or "typeOf" or "classify" API.
>> 
>> Comments welcome. I'm not sure what is best but lean toward predicates as 
>> goods in themselves, even if not the complete solution (if there is a 
>> complete solution).
> 
> It would be great if we could eliminate these predicates completely. How 
> often does the frame crossing problem matter in practice? It doesn’t show up 
> in non-browser environments, right?
> 
> I see several possibilities:
> - Make instanceof work correctly with objects that have crossed frames.
> - Introduce a binary predicate, e.g. likeInstanceOf that correctly handles 
> cases where the lhs and rhs come from different contexts/frames.
> 
> Additionally, one could throw an exception if there is an instanceof check 
> whose lhs and rhs are from different contexts (failing fast, preventing 
> obscure and hard-to-debug errors).


When you want to dispatch based on a type, a fixed typeof (one that worked 
well) would be better:

switch (typeof x)

case "Array":

case "RegExp":

case ...


else you'd have to do:

if (Array.isArray(x)) ...
else if (RegExp.isRegExp(x)) ...
else if ( etc )

When you just want to assert that x is of type Type, then an if 
(Type.isType(x)) would be ok, but a proper typeof would do just as well: if 
(typeof x === "Type")

So it seems that a new, fixed typeof would be best?

And if the new, fixed typeof were typeOf(), with capital O, a global function 
instead of a language keyword/operator? That would be easily polyfill-able.
-- 
Jorge.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to