Made isPlainObject() supporting null, undefined, and window values on IE too. Also...
authorRobert Katic <robert.katic@gmail.com>
Fri, 18 Dec 2009 16:34:20 +0000 (00:34 +0800)
committerJohn Resig <jeresig@gmail.com>
Fri, 18 Dec 2009 17:19:34 +0000 (01:19 +0800)
src/core.js
test/unit/core.js

index 1edf98e..bc48e5d 100644 (file)
@@ -425,19 +425,21 @@ jQuery.extend({
        },
 
        isPlainObject: function( obj ) {
-               if ( toString.call(obj) !== "[object Object]" || typeof obj.nodeType === "number" ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               if ( !obj || toString.call(obj) !== "[object Object]" || !("constructor" in obj) ) {
                        return false;
                }
                
-               // not own constructor property must be Object
+               // Not own constructor property must be Object
                if ( obj.constructor
                        && !hasOwnProperty.call(obj, "constructor")
                        && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
                        return false;
                }
                
-               //own properties are iterated firstly,
-               //so to speed up, we can test last one if it is own or not
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
        
                var key;
                for ( key in obj ) {}
index 185f77a..1e03c96 100644 (file)
@@ -204,12 +204,22 @@ test("trim", function() {
 });
 
 test("isPlainObject", function() {
-       expect(7);
+       expect(14);
 
        stop();
 
        // The use case that we want to match
        ok(jQuery.isPlainObject({}), "{}");
+       
+       // Not objects shouldn't be matched
+       ok(!jQuery.isPlainObject(""), "string");
+       ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number");
+       ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean");
+       ok(!jQuery.isPlainObject(null), "null");
+       ok(!jQuery.isPlainObject(undefined), "undefined");
+       
+       // Arrays shouldn't be matched
+       ok(!jQuery.isPlainObject([]), "array");
  
        // Instantiated objects shouldn't be matched
        ok(!jQuery.isPlainObject(new Date), "new Date");
@@ -231,6 +241,9 @@ test("isPlainObject", function() {
 
        // DOM Element
        ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
+       
+       // Window
+       ok(!jQuery.isPlainObject(window), "window");
  
        var iframe = document.createElement("iframe");
        document.body.appendChild(iframe);