Being tired of all the idiosyncrasies of the typeof() operator, I
tried to make something better:

    function typeName(value) {
        if (typeof(value) !== "object" && !(value instanceof RegExp)) {
            return typeof(value);
        } else if (value == null) {
            return "null";
        } else {
            var c = value.constructor || {};
            return c.name || c.NAME || "Object";
        }
    }

Thinking about including this in MochiKit.Base, possibly modifying
typeMatcher() on the go. That would break backward compatibility a
bit, so the question is if it would be worthwhile?

This is how typeName() works right now:

  undefined
  ==> "undefined"
  null
  ==> "null"
  false
  ==> "boolean"
  new Boolean(true)
  ==> "Boolean"
  42
  ==> "number"
  new Number(42)
  ==> "Number" [1]
  "test"
  ==> "string"
  new String("")
  ==> "String" [1]
  { a: 1 }
  ==> "Object" [2]
  [1,2,3]
  ==> "Array"
  new Date()
  ==> "Date"
  /\d+/
  ==> "RegExp"
  new MyClass()
  ==> "MyClass" [3]

Notes:
[1]: There are two forms of these built-in types, but normally the
"constructor" form is not used much.
[2]: These objects constructor actually point to the Object function,
hence the upper-case initial.
[3]: For this to work, the constructor property must be set and the
constructor function must have either a name or a NAME property.

Cheers,

/Per

-- 
You received this message because you are subscribed to the Google Groups 
"MochiKit" group.
To post to this group, send email to mochi...@googlegroups.com.
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en.

Reply via email to