JavaScript比較對象是否相等方法詳解

來源:互聯網
上載者:User

在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()轉換成原始類型再進行比較

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.