jq1.4中新增了个静态方法$.isPlainObject,见http://api.jquery.com/jquery.isPlainObject/
。对于通过字面量定义的对象和new Object的对象返回true,new Object时传参数的返回false,如:
var p1 = new Object;
p1.name = 'tom';
var o1 = new Object('aa');
console.log($.isPlainObject({name:'Jack'})); //-> true
console.log($.isPlainObject(p1)); //-> true
console.log($.isPlainObject('aa')); //-> false
console.log($.isPlainObject(o1)); //-> false
$.isPlainObject(o1)返回也是false,见: 关于 new Object 时传参的一些细节
通过字面量定义的对象,其构造器是Object,很容易证明。
var obj = {};
console.log(obj.constructor === Object); //-> true
感觉1.4新加的这个方法用处不大,只能判断由Object构造器生成的对象(传参数时例外),甚至一度以为这只是在jq内部用而已,但偏偏公开了,挂在了$上。当自定义一个类(构造器),用$.isPlainObject判断new自定义类的对象时将返回false。
//自定义类(构造器),创建一个对象p
function Person(){this.name='jack'}
var p = new Person();
$.isPlainObject(p); //-> false
因此想写一个对于通过字面量定义及通过自定义类(构造器)创建的对象都返回true的方法。
function myIsPlainObject( obj ){
return Object.prototype.toString.call(obj)==='[object Object]';
}
测试:
function Person(name){
this.name=name;
}
var p = new Person('jack');
var o = {name:'tom'};
console.log(myIsPlainObject(p)); //-> true
console.log(myIsPlainObject(o)); //-> true
都返回true,一切貌似很顺利。偏偏IE中window/document/document.body/HTMLElement/HTMLCollection/NodeList/也返回true。
即IE中Object.prototype.toString.call以上对象返回的字符串也是'[object Object]',不知IE为何这样实现,Firefox/Chrome/Safari/Opera则不然。
修改下:
function myIsPlainObject( obj ){
return 'isPrototypeOf' in obj && Object.prototype.toString.call(obj)==='[object Object]';
}
这里判断obj是否具有isPrototypeOf属性,isPrototypeOf是挂在Object.prototype上的。通过字面量或自定义类(构造器)创建的对象都会继承该属性方法,在有约定的情况下,这个方法可以使用。
console.log(myIsPlainObject(window)); //-> false
console.log(myIsPlainObject(document)); //-> false
但不遵守约定的情况下,仍然失败,如在window上人为的
添加isPrototypeOf属性
window.isPrototypeOf = '';
console.log(myIsPlainObject(window)); //-> true
最后可以参考cai兄的讨论:http://cmc3.cn/n/2010/05/01/156.html
分享到:
相关推荐
jQuery.isPlainObject-v1.10.2源码
### 知识点:isPlainObject 方法分析 #### 1. jQuery 中的 isPlainObject 方法 - isPlainObject 是在 jQuery 1.4 版本中引入的一个方法,用于检测传入的对象是否是一个纯粹的对象。 - 所谓的“纯粹对象”主要是指...
这个方法的作用是为了跟其他的 JavaScript对象如 null,数组,宿主对象(documents),DOM 等作区分,因为这些用 typeof 都会返回object。 使用 语法: $.isPlainObject( object ) 参数说明: object:任意类型 ...
我正寻找: 一种检查任何类型(包括非原始类型)的简单方法能够检查对象是普通对象{}还是特殊对象(例如类实例) ! 让TypeScript在检查时自动知道值的类型那is-what ! (很棒的文字游戏 :grinning_face_with_big_...
在JavaScript编程中,`isPlainObject`是一个常用的方法,用于判断一个对象是否是"纯对象",也就是由`{}`或`new Object()`创建的对象。这个功能在处理数据验证、深度克隆等场景中十分常见。`instanceof`操作符则是...
- `.isPlainObject()`:确认参数是否为普通对象(非数组、DOM元素等)。 - `.support()`:检测浏览器对特定特性的支持情况。 8. **事件操作**:jQuery 的事件处理非常强大,可以使用 `.on()`, `.off()`, `....
使用$.isPlainObject()函数检测对象是否为原始对象 使用$.contains()函数检测两个节点是否包含 使用$.param()进行数组元素序列化 使用函数$.extend()扩展工具函数 使用函数$.proxy()改变事件函数的作用域 使用...
类型检测是编程中常见的需求,jQuery 提供了 `jQuery.isArray()`、`jQuery.isPlainObject()` 和 `jQuery.isFunction()` 等方法,它们在类型检测方面比 JavaScript 原生的 `typeof` 操作符更为准确和强大。...
这里使用了`jQuery.isPlainObject`检查是否为普通对象,`jQuery.isArray`检查是否为数组。如果是数组,`copyIsArray`标志被设置为`true`,然后创建一个新的空数组`clone`,用于存放源数组的拷贝。 对于数组的处理,...
jQuery还包含一系列实用工具方法,如`$.each()`用于遍历数组或对象,`$.inArray()`检查元素是否存在于数组中,`$.trim()`去除字符串两端的空白,`$.isPlainObject()`判断对象是否为纯对象等。 总结,jQuery API不仅...
8. **工具方法(Utility Methods)**:如`$.each()`用于迭代数组或对象,`$.extend()`合并对象,`$.trim()`去除字符串两端的空白,`$.isPlainObject()`检测是否为纯对象等。 9. **插件扩展(Plugins)**:jQuery的...
- `$.isPlainObject(val)`:这个JQuery方法用于检测传入的值是否为一个纯粹的对象。纯粹的对象指的是通过 "{}" 或 "new Object" 创建的对象。 - `$.isArray(val)`:这个JQuery方法用于检测传入的值是否是一个数组。 ...
9. **实用工具方法**:jQuery还提供了很多实用工具方法,如`$.trim()`, `.isPlainObject()`, `.type()`等,用于字符串处理、对象判断和类型检测。 10. **版本更新与兼容性**:jQuery 1.11.0是稳定版本,对老版本的...
`isEmpty()`和`isPlainObject()`函数则帮助开发者更有效地处理数据结构。此外,fbjs还包含了`ExecutionEnvironment`模块,它提供了检测浏览器环境是否支持某些特性的能力,这对于编写跨平台的React应用尤为重要。 ...
9. **实用方法**:`$.trim()`去除字符串两端的空白,`$.isPlainObject()`检测是否为纯净的对象,`$.inArray()`检查元素是否存在于数组中。 10. **版本和兼容性**:jQuery有多个版本,如1.x、2.x和3.x,不同版本对IE...
类型判断在jQuery中用于确定变量的类型,比如$.isPlainObject()检查是否为纯对象。仿队列接口用于管理异步操作,如$.queue(),确保操作按顺序执行。链式调用是jQuery的一大特色,通过返回自身来实现方法连续调用。 ...