js 判斷對象相等


    文筆不是很好,一直在博客園屬於那種只看不說的那種,有次心血來潮,想把自己的一些心得記錄下來,我認認真真寫了大半個小時,誰知一點保存,會話超時然后我的東西不知道去哪里,當時想死的心都有,寫博客也就沒那個興趣了。平常遇到問題可能就和周圍的同事討論下,然后就是發發貼 ,看有什么解決方案么,但這種情況不是很理想,提出的問題不知道是別人沒看懂,還是我沒表述清楚,發出去的問題就像肉包子打狗一樣,沒有了下文。下面進入今天的主題吧。

    在js 判斷相等常見的就是 == (等同)和===(恆等); 
    ==, 兩邊值類型不同的時候,要先進行類型轉換,再比較 ;
    ===,不做類型轉換,類型不同的一定不等。      

   例:
    var a = 3;
    var b = "3"; 
    a==b 返回 true
    a===b 返回 false 
   這個是基本類型相等的判斷。

   如果是對象的判斷,那又會出現什么情況呢?

 var People = function (id, name) {
         
  
this.id = id;
          
 
this.name = name;
    
    }

var a = new People("3","小肖"); var b = new People("3","小肖"); var c = a; console.log("對象相等判斷:"+ (a==b));//false console.log("對象相等判斷:"+ (a==c));// true console.log("對象相等判斷:"+ (b==c)); //false
console.log("對象相等判斷:"+ (a===c));// true

     對象都是按地址進行傳遞的, 這里我就自認為他們對象和java,C#一樣比的對象的地址是否相等?在java中我們比較兩個對象的值是否相等使用的是equal的方式,最終比的是對象的hashcode 是否相等,如果相等就可判斷兩個對象時等同的。在js中沒有這樣的函數,自然想起能否自己寫一個通用的函數來做判斷,自然想到如下方法:

  var People = function (id, name) {
            this.id = id;
            this.name = name;
        }

        People.prototype.equal = function (obj) {
            if (obj instanceof People) {
                var result = true;
                for (k in this) {
                    if (this[k] != obj[k]) {
                        result = false;
                        break;
                    }
                }
                return result;
            } else {
                return false;
            }
        }
        var a = new People("3", "小肖");
        var b = new People("3", "小肖");
        var c = a;

        console.log("對象相等判斷a equal b:" + (a.equal(b))); //true

 

   好像現在能滿足我的要求了,但是這只是在最一般情況下。如我對 a 或者b 進行簡單的修改

       a.value = 98; //對a 對象添加一個值,在java對象中顯然不能這么做,但js中這樣做不推薦,但並不排除 有人不這么干。
        console.log("對象相等判斷a equal b:" + (a.equal(b))); //false
        delete a.value;
        b.value = 98;
        console.log("對象相等判斷a equal b:" + (a.equal(b))); //true

 在這種情況也許最簡單的方式那 檢查兩個屬性的長度是否相等就可以解決問題了,這樣是可以解決問題,但是又有情況又出現了,請看

    var People = function (id, name, arr) {
            this.id = id;
            this.name = name;
            this.group = arr;
        }

        People.prototype.equal = function (obj) {
            if (obj instanceof People) {
                var result = true;
                for (k in this) {
                    if (this[k] != obj[k]) {
                        result = false;
                        break;
                    }
                }
                return result;
            } else {
                return false;
            }
        }
        var a = new People("3", "小肖", [1, 2]);
        var b = new People("3", "小肖", [1, 2]);
        console.log("對象相等判斷a equal b:" + (a.equal(b))); //false

    當對象的字段 不是基本類型,而是對象,這個時候又不相等了。本來值是相等的,我們期待的結果是返回true。這個時候可能又會想到的解決方案是我們再進行類型判斷。
如果是Object類型,或者數組等(即對象類型),我們再采用遞歸的方式來重復調用自己來做判斷。這好像也行。但這樣做是不是有點把問題搞復雜了,有么有更好的思路或者方法來解決這個問題呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM