On Feb 8, 1:19 pm, RobG <rg...@iinet.net.au> wrote:
> On Feb 8, 12:55 am, Jim Higson <j...@333.org> wrote:
>
> > alert( Object.isString( "foo" ));
> > // alerts "string"
>
> It alerts true.

So it does ^-)

> > alert( Object.isString( new String( "foo" ) ));
> > // alerts "object"
>
> It alerts false.

^-) again

> > I know why this happens - because Prototype uses the underlying typeof's
> > understanding of type.
>
> That typeof returns the type is pretty reasonable given that it is
> called "typeof".
>

> > Personally I think this is a bug though - Javascript is just being difficult
> > here
>
> It's a bit unfair to blame the language for what you consider an
> inappropriate use of one of its features.  Perhaps the name of the
> function should be "isStringPrimitive".

I guess I *am* blaming Javascript for having (in effect) two string
types. No other languages do this and (as far as I know) having two
kinds of strings doesn't let you do any cool stuff that you couldn't
do with one.

I see having two string types as one of those strange quirks of
Javascript that libraries like Prototype should smooth over so the
programmer can just think "...Ok I've got a string..." without
worrying which of the types of strings s/he has.

> > and Prototype should make stuff like this easier. It should
> > return "string" regardless of how the string was created.
>
> It is extremely rare to come across a String object in javascript, so
> there seems very little point in an isString function when the vast
> majority of the time a typeof test is sufficient (and less
> problematic).

Personally, I think the rareness of String objects is part of the
reason why it *is* desirable to take them into the account. As a
programmer you make assumptions that you're dealing with normal
strings, then suddenly an object String turns up everything breaks.
But you come to debug and the object string looks a lot like a normal
string and the bug takes ages to track down.

I started this thread when some library code I use started acting
oddly.
It turns out this was because some other code (which I didn't write)
was passing new String('foo') into it.

Off the top of my head, my code was something like:

if( Object.isString( foo ) ){
   do something( foo );
}else if( Object.isObject( foo ) ){
   foo.each( function( i ){ /* ... */ } )
}

So given a String object was iterating through each char in the
String.

> In the unlikely event that you want to know if the thing you have is a
> String object, use instanceof.  What is the use of an isString
> function that can't tell the difference between an object and a
> primitive?

I think treating them as both just Strings makes for easier to read
code.

At the moment I test like this:

if( Object.isString( foo ) ||
  ( Object.isObject( foo ) && foo.constructor == String ) ) {
//...
}

I can't think of any reason why I'd want to react to primitive Strings
differently from string objects, so I think just writing this makes
clearer code:

if( Object.isString( foo ) ) {
//...
}

> I can't conceive of a scenario where a String object would be used and
> I'd get into a situation where I needed to test for something that was
> either an object or a string.  If it doesn't matter, why use an
> object?

Because I can't always control the values that are passed to functions
that I write. I don't know of any good reason why one would create a
String object, but if some client code does I should at least handle
it gracefully.

> And if it did matter, I'd want to test for one or the other
> in which case neither the current isString or your suggested
> modification would do the job.

Can you give examples of where it would matter?

> Perhaps is should return one of three values: primitive, object or
> boolean false.  Then if you don't care, you can use use:
>
>   if (isString(...)) ...
>
> as either 'object' or 'primitive' will resolve to true, but boolean
> false will be false.
>
> If you do care, you can use:
>
>   if (isString(...) ==  'primitive') ...

I think this is a very neat solution :-)

> The bottom line is to look at why you would use such a function, and
> whether there are already suitable language features that do the job.
>
> > Anyone agree I should file this as a bug, or is there a good reason the
> > current behaviour is desirable?
>
> It can hardly be called a bug when it does what the documentation says
> it does (I think "works as designed" is the polite response).  The
> function itself is a bit pointless though, as are similar functions
> like isNumber, e.g.

Ok, but it can "work as designed" and the design can be sub-optimal.

--
Jim
blog: http://jimhigson.blogspot.com/
web: http://wikizzle.org
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to