js中判断Object、Array、Function等引用类型对象是否相等


Posted in Javascript onAugust 29, 2012

在迭代中,我们还要注意的是,对象或者数组中的元素可能是一个任意值——除了原始类型值、object、arrray外,这个值还可能是一个方法、一个DOM对象或者window对象,可能你已经注意到了,有部分引用类型是不能进行迭代的,需要分支判断,代码如下:

function compare(a,b){ 
var 
pt = /undefined|number|string|boolean/, 
fn = /^(function\s*)(\w*\b)/, 
cr = "constructor", 
cn = "childNodes", 
pn = "parentNode", 
ce = arguments.callee; 
if(pt.test(typeof a) || pt.test(typeof b) || a === null || b === null){ 
return a === b || (isNaN(a) && isNaN(b)); //为了方便,此处假定NaN == NaN 
} 
if(a[cr] !== b[cr]){ 
return false; 
} 
switch(a[cr]){ 
case Date : { 
return a.valueOf() === b.valueOf(); 
}; 
case Function : { 
return a.toString().replace(fn,'$1') === b.toString().replace(fn,'$1'); //硬编码中声明函数的方式会影响到toString的结果,因此用正则进行格式化 
}; 
case Array : { 
if(a.length !== b.length){ 
return false; 
} 
for(var i=0;i<a.length;i++){ 
if(!ce(a[i],b[i])){ 
return false; 
} 
} 
break; 
}; 
default : { 
var alen = 0, blen = 0, d; 
if(a === b){ 
return true; 
} 
if(a[cn] || a[pn] || b[cn] || b[pn]){ 
return a === b; 
} 
for(d in a){ 
alen++ ; 
} 
for(d in b){ 
blen++; 
} 
if(alen !== blen){ 
return false; 
} 
for(d in a){ 
if(!ce(a[d],b[d])){ 
return false; 
} 
} 
break; 
}; 
} 
return true; 
} 
console.log(compare({},{a:1})); //false 
console.log(compare({a:1},{b:2})); //false 
console.log(compare({b:2,a:1},{a:1,b:2})); //true 
console.log(compare({a:function(){return false;},b:2},{a:function(){return false;},b:2})); //true 
console.log(compare([],[])); //true 
console.log(compare([2,1],[1,2])); //false 
console.log(compare(function(){alert(1)},function(){})); //false 
console.log(compare(function aaa(){alert(1)},function(){alert(1)})); //true 
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[1])); //false 
console.log(compare(document.getElementsByTagName("a")[0],document.getElementsByTagName("a")[0])); //true
Javascript 相关文章推荐
JavaScript中的私有成员
Sep 18 Javascript
javascript getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
jquery蒙版控件实现代码
Dec 08 Javascript
iphone safari不支持position fixed的解决方法
May 04 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
Sep 21 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
Sep 23 Javascript
Angular6项目打包优化的实现方法
Dec 15 Javascript
mustache.js实现首页元件动态渲染的示例代码
Dec 28 Javascript
xml转json的js代码
Aug 28 #Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
Aug 28 #Javascript
javascript 判断中文字符长度的函数代码
Aug 27 #Javascript
Jquery 数据选择插件Pickerbox使用介绍
Aug 24 #Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 #Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 #Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 #Javascript
You might like
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php操作JSON格式数据的实现代码
2011/12/24 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
laravel学习教程之关联模型
2016/07/30 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
python进程与线程小结实例分析
2018/11/11 PHP
js判断输入是否为数字的具体实例
2013/08/03 Javascript
理解Javascript闭包
2013/11/01 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
python使用cPickle模块序列化实例
2014/09/25 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
公司活动邀请函
2014/01/24 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
会计员岗位职责
2014/03/15 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
办公室主任岗位职责
2015/01/31 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
政协工作总结2015
2015/05/20 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
浅谈Python协程asyncio
2021/06/20 Python
理解python中装饰器的作用
2021/07/21 Python