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 相关文章推荐
JS 判断代码全收集
Apr 28 Javascript
js几个验证函数代码
Mar 25 Javascript
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
vue实现模态框的通用写法推荐
Feb 26 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
Fetch超时设置与终止请求详解
May 18 Javascript
js实现蒙版效果
Jan 11 Javascript
javascrpt密码强度校验函数详解
Mar 18 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
自己做矿石收音机
2021/03/02 无线电
多重?l件?合查?(一)
2006/10/09 PHP
php mysql数据库操作分页类
2008/06/04 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
PHP制作万年历
2015/01/07 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
jquery $.getJSON()跨域请求
2011/12/21 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
Python中内建函数的简单用法说明
2016/05/05 Python
python机器学习之神经网络(一)
2017/12/20 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Python生成词云的实现代码
2020/01/14 Python
Python-for循环的内部机制
2020/06/12 Python
python实现磁盘日志清理的示例
2020/11/05 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
成人大专生实习期的自我评价
2013/10/02 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
品牌服务方案
2014/06/03 职场文书
政协会议宣传标语
2014/10/09 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python