最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript趣题:深度比较对象

来源:动视网 责编:小采 时间:2020-11-27 20:26:05
文档

JavaScript趣题:深度比较对象

JavaScript趣题:深度比较对象:在JavaScript中比较两个对象不是件轻松的活儿,而且它本身并没有提供这样的API。如果你想用"=="运算符来比较两个对象,那就大错特错了。"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回true。譬如如下的例子,就肯定
推荐度:
导读JavaScript趣题:深度比较对象:在JavaScript中比较两个对象不是件轻松的活儿,而且它本身并没有提供这样的API。如果你想用"=="运算符来比较两个对象,那就大错特错了。"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回true。譬如如下的例子,就肯定


在JavaScript中比较两个对象不是件轻松的活儿,而且它本身并没有提供这样的API。

如果你想用"=="运算符来比较两个对象,那就大错特错了。

"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回true。

譬如如下的例子,就肯定会返回false。

var a = { name: 'Joe' }; 
var b = { name: 'Joe' }; 
a == b; //-> false

那么咋们比较两个对象的标准是什么呢?

1.它们是否有同样的属性名

2.它们是否有同样的属性值

比如上面的a,b两个对象,它们都有为“name”的属性名,都有为“Joe”的属性值,所以就可以说,它们是“相似的”。

换句话说,我们此次的目的,是判断,两个JS对象是否是“相似的”。

上面的两个对象都很简单,如果我们遇到对象嵌套对象的情况,就会变得复杂起来。

因为对象的类型有很多种,比如正则对象,函数对象,日期对象,对它们的比较会增加程序复杂程度,因此,在这里我们只考虑几种情况:普通对象({}),数组对象([])和简单基本类型(string,number,boolean,null,undefined)。

即使简化了需求,完成这个比较相似也不是件容易的事儿,在下面我用到了深度遍历对象,逐一比较对象的属性名和值。

function deepCompare(o1, o2) { 
 //标识是否相似 
 var flag = true; 
 
 var traverse = function(o1,o2){ 
 //如果至少有一个不是对象 
 if(!(o1 instanceof Object) || !(o2 instanceof Object)){ 
 if(o1 !== o2){ 
 flag = false; 
 } 
 return; 
 } 
 //如果两个对象的属性数量不一致 
 //比如: 
 //a:{name:"Jack",age:22} 
 //b:{name:"Jack"} 
 if(Object.keys(o1).length != Object.keys(o2).length){ 
 flag = false; 
 } 
 //若有不同之处,尽早结束递归 
 if(flag){ 
 //深度遍历对象 
 for(var i in o1){ 
 //若都是对象,继续递归 
 if(typeof o1[i] === "object" && typeof o2[i] === "object"){ 
 traverse(o1[i],o2[i]); 
 }//若都不是对象,则比较值 
 else if(typeof o1[i] !== "object" && typeof o2[i] !== "object"){ 
 if(o1[i] !== o2[i]){ 
 flag = false;; 
 } 
 }//一个是对象,一个不是对象,肯定不相似 
 else{ 
 flag = false; 
 } 
 } 
 } 
 }; 
 
 traverse(o1,o2); 
 
 return flag; 
};

文档

JavaScript趣题:深度比较对象

JavaScript趣题:深度比较对象:在JavaScript中比较两个对象不是件轻松的活儿,而且它本身并没有提供这样的API。如果你想用"=="运算符来比较两个对象,那就大错特错了。"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回true。譬如如下的例子,就肯定
推荐度:
标签: 比较 js 对象
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top