Commit 148fb7ba authored by Robert Katic's avatar Robert Katic Committed by John Resig

Made isPlainObject() supporting null, undefined, and window values on IE too....

Made isPlainObject() supporting null, undefined, and window values on IE too. Also added some related tests. Fixes #5669.
parent 27d65b59
...@@ -425,19 +425,21 @@ jQuery.extend({ ...@@ -425,19 +425,21 @@ jQuery.extend({
}, },
isPlainObject: function( obj ) { 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; return false;
} }
// not own constructor property must be Object // Not own constructor property must be Object
if ( obj.constructor if ( obj.constructor
&& !hasOwnProperty.call(obj, "constructor") && !hasOwnProperty.call(obj, "constructor")
&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false; return false;
} }
//own properties are iterated firstly, // Own properties are enumerated firstly, so to speed up,
//so to speed up, we can test last one if it is own or not // if last one is own, then all properties are own.
var key; var key;
for ( key in obj ) {} for ( key in obj ) {}
......
...@@ -204,12 +204,22 @@ test("trim", function() { ...@@ -204,12 +204,22 @@ test("trim", function() {
}); });
test("isPlainObject", function() { test("isPlainObject", function() {
expect(7); expect(14);
stop(); stop();
// The use case that we want to match // The use case that we want to match
ok(jQuery.isPlainObject({}), "{}"); 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 // Instantiated objects shouldn't be matched
ok(!jQuery.isPlainObject(new Date), "new Date"); ok(!jQuery.isPlainObject(new Date), "new Date");
...@@ -231,6 +241,9 @@ test("isPlainObject", function() { ...@@ -231,6 +241,9 @@ test("isPlainObject", function() {
// DOM Element // DOM Element
ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element"); ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
// Window
ok(!jQuery.isPlainObject(window), "window");
var iframe = document.createElement("iframe"); var iframe = document.createElement("iframe");
document.body.appendChild(iframe); document.body.appendChild(iframe);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment