Made jQuery.type more consistent with host objects.
authorRobert Katic <robert.katic@gmail.com>
Fri, 27 Aug 2010 23:14:59 +0000 (01:14 +0200)
committerjeresig <jeresig@gmail.com>
Thu, 23 Sep 2010 16:08:41 +0000 (12:08 -0400)
src/core.js
test/unit/core.js

index 23d40bd..158f479 100644 (file)
@@ -69,7 +69,10 @@ var jQuery = function( selector, context ) {
        push = Array.prototype.push,
        slice = Array.prototype.slice,
        trim = String.prototype.trim,
-       indexOf = Array.prototype.indexOf;
+       indexOf = Array.prototype.indexOf,
+       
+       // [[Class]] -> type pairs
+       class2type = {};
 
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
@@ -487,7 +490,7 @@ jQuery.extend({
        type: function( obj ) {
                return obj == null ?
                        String( obj ) :
-                       toString.call(obj).slice(8, -1).toLowerCase();
+                       class2type[ toString.call(obj) ] || "object";
        },
 
        isPlainObject: function( obj ) {
@@ -799,6 +802,11 @@ jQuery.extend({
        browser: {}
 });
 
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
 browserMatch = jQuery.uaMatch( userAgent );
 if ( browserMatch.browser ) {
        jQuery.browser[ browserMatch.browser ] = true;
index d83f667..85b8da6 100644 (file)
@@ -219,7 +219,7 @@ test("trim", function() {
 });
 
 test("type", function() {
-       expect(18);
+       expect(22);
 
        equals( jQuery.type(null), "null", "null" );
        equals( jQuery.type(undefined), "undefined", "undefined" );
@@ -239,6 +239,10 @@ test("type", function() {
        equals( jQuery.type(new Date()), "date", "Date" );
        equals( jQuery.type(new Function("return;")), "function", "Function" );
        equals( jQuery.type(function(){}), "function", "Function" );
+       equals( jQuery.type(window), "object", "Window" );
+       equals( jQuery.type(document.body), "object", "Element" );
+       equals( jQuery.type(document.createTextNode("foo")), "object", "TextNode" );
+       equals( jQuery.type(document.getElementsByTagName("*")), "object", "NodeList" );
 });
 
 test("isPlainObject", function() {