文筆不是很好,一直在博客園屬於那種只看不說的那種,有次心血來潮,想把自己的一些心得記錄下來,我認認真真寫了大半個小時,誰知一點保存,會話超時然后我的東西不知道去哪里,當時想死的心都有,寫博客也就沒那個興趣了。平常遇到問題可能就和周圍的同事討論下,然后就是發發貼 ,看有什么解決方案么,但這種情況不是很理想,提出的問題不知道是別人沒看懂,還是我沒表述清楚,發出去的問題就像肉包子打狗一樣,沒有了下文。下面進入今天的主題吧。
在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類型,或者數組等(即對象類型),我們再采用遞歸的方式來重復調用自己來做判斷。這好像也行。但這樣做是不是有點把問題搞復雜了,有么有更好的思路或者方法來解決這個問題呢?