网站地图    收藏   

主页 > 前端 > javascript >

JavaScript比较对象是否相等方法详解

来源:自学PHP网    时间:2014-09-19 14:47 作者: 阅读:

[导读] 本文章来给各位同学介绍JavaScript比较对象是否相等方法详解,有需要了解的朋友不防进入参考参考。...

在JavaScript中比较两个对象的成员是否相等有点麻烦,如果只是第一层比较,很容易,但子对象里的属性可能又是一个对象,所以只能递归

 代码如下 复制代码

// 去重
Array.prototype.unique = function(){
    this.sort();
    var re=[this[0]];
    for(var i = 1; i < this.length; i++){
        if( this[i] !== re[re.length-1]){
            re.push(this[i]);
        }
    }
    return re;
}
 
var o2o = function(o1,o2){
 
    if(typeof o1 != typeof o2){
        return false;   
    }
 
    if(typeof o1.length != typeof o2.length ){
        return false;   
    }
 
    var bool = true;
 
    var keyArr1 = [];
    var keyArr2 = [];
         
    for(var i in o1){
        keyArr1.push(i);
    }
 
    for(var i in o2){
        keyArr2.push(i);
    }
 
    if(keyArr1.length != keyArr2.length){
        return false;
    }
 
    for(var i=0, k=keyArr2.length;i<k;i++){
        keyArr1.push(keyArr2[i]);   
    }
 
    var keyArr = keyArr1.unique();
 
    for(var i=0,k=keyArr.length;i<k;i++){
        if( ( keyArr[i] in o1 ) && ( keyArr[i] in o2 ) ){
            if( typeof o1[keyArr[i]] == 'object' && typeof o2[keyArr[i]] == 'object' ){
                bool = o2o( o1[keyArr[i]], o2[keyArr[i]] );
            }else if( o1[keyArr[i]] !== o2[keyArr[i]] ){
                return false;
            }
        }else{
            return false;
        }
    }
 
    return bool;
};

使用方法


var o1 = {
    age : 18,
    info : {
        'author' : 'lee',
        'job' : [
            'a','b'
        ]
    },
    'name' : 'laowu'
};
 
 
var o2 = {
    'name' : 'laowu',
    'age' : 18,
    info : {
        'author' : 'lee',
        'job' : [
            'a',        
            'b'
        ]
    }
};
 
console.log(o2o(o1,o2)); // true

把o1的age换成字符串的18

var o1 = {
    age : "18",
    info : {
        'author' : 'lee',
        'job' : [
            'a','b'
        ]
    },
    'name' : 'laowu'
};
 
 
var o2 = {
    'name' : 'laowu',
    'age' : 18,
    info : {
        'author' : 'lee',
        'job' : [
            'a',        
            'b'
        ]
    }
};
 
console.log(o2o(o1,o2)); // false

类型不一致,结果为false


补充一下变量相等常识

判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。 ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。等号和非等号
在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。执行类型转换的规则如下:如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。下表列出了一些特殊情况,以及它们的结果:表达式 值
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true 全等号和非全等号
等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。例如: var sNum = "66";
var iNum = 66;
alert(sNum == iNum); //输出 "true"
alert(sNum === iNum); //输出 "false"
在这段代码中,第一个 alert 使用等号来比较字符串 "66" 和数字 66,输出 "true"。如前所述,这是因为字符串 "66" 将被转换成数字 66,,然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,所以输出 "false"。非全等号由感叹号加两个等号(!==)表示,只有在无需类型转换运算数不相等的情况下,才返回 true。例如: var sNum = "66";
var iNum = 66;
alert(sNum != iNum); //输出 "false"
alert(sNum !== iNum); //输出 "true"
这里,第一个 alert 使用非等号,把字符串 "66" 转换成数字 66,使得它与第二个运算数 66 相等。因此,计算结果为 "false",因为两个运算数是相等的。第二个 alert 使用的非全等号。该运算是在问:"sNum" 与 "iNum" 不同吗?这个问题的答案是:是的(true),因为 sNum 是字符串,而 iNum 是数字,它们当然不同。

要是两个值类型不同,返回false
要是两个值都是number类型,并且数值相同,返回true
要是两个值都是stirng,并且两个值的String内容相同,返回true
要是两个值都是true或者都是false,返回true
要是两个值都是指向相同的Object,Arraya或者function,返回true
要是两个值都是null或者都是undefined,返回true
==操作符:
如果两个值具有相同类型,会进行===比较,返回===的比较值
如果两个值不具有相同类型,也有可能返回true
如果一个值是null另一个值是undefined,返回true
如果一个值是string另个是number,会把string转换成number再进行比较
如果一个值是true,会把它转成1再比较,false会转成0
如果一个值是Object,另一个是number或者string,会把Object利用 valueOf()或者toString()转换成原始类型再进行比较

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论