Js 作為弱類型語言,對變量類型并不“感冒”,是以要比較兩個變量是否相同要怎麼操作呢?
1. 比較兩個字元串是否相等
var str1 = "aaa";
var str2 = "aaa";
if(str1 == str2)alert("ok");
如果兩個變量屬于不同類型呢?畢竟 js 還是有 bool,string,number 基本類的
Alert(1==’1’) ,打出的結果是 true ,這說明這些基本類型在底層都是以相同的格式存儲的
2. Js 裡面的對象比較
js 中的對象比較和 java 中是一樣的,隻有位址相同才相等。當比較兩個引用值時,比較的是兩個引用位址,看它們引用的原值是否為同一個副本,而不是比較它們的原值位元組是否相等。隻有 string 、 number 、 boolean 三種基本類型才是可以直接對值進行比較。
下面是從網上找的一段很好的例子
感謝作者: http://www.jb51.net/article/17912.htm
比較符 :==,!=,===,!==,>=,<=,>,<
== 總是試圖比較他們的值,如果類型不一樣,總是試圖作轉化。
=== 比較同一性,不作轉化就比較
== 如果是基本類型 (string, number, boolean) ,比較他們的值,
1. 基本類型比較
var a = "123";
var b = 123;
則 (a==b) = true;
(a===b) = false;
2. 對象比較
如果是 object, array, function 類型,比較他們的 reference. 隻有當他們的 reference 相等才為 true.
function Point(x,y){
this.x = x;
this.y = y;
};
Point.prototype.toString = function(){
alert("in toString");
return "x=" + this.x + " y=" + this.y;
};
Point.prototype.valueOf = function(){
alert("in valueOf");
return this.x+this.y;
};
var pa = new Point(1,1);
var pb = new Point(1,1);
var pc = pa;
則: pa!=pb;
pa!==pb;
pa==pc;
pa===pc;
var arr1 = [1,2,3];
var arr2 = [1,2,3];
arr1!=arr2, arr1!==arr2
不得不說一下 0, false, null, undefined
var t1 = 0;
var t2 = false;
var t3 = null;
var t4;
則: t1==t2;t1!==t2;
t1!=t3; t1!==t3;
t1!=t4; t1!==t4;
t2!=t3; t2!==t3;
t2!=t4; t2!==t4;
t3==t4; t3!==t4;
3. 比較對象的轉換順序
如果一個 object 和一個基本類型比較 , 則先調用對象的 valueOf, 再調用對象的 toString 與基本類型進行比較。也就是說先轉成 number 型,再轉成 string 類型
如果是與 boolean 比較 , 先把 true 轉為 1,false 轉為 0 再比較。
var pa = new Point(1,1);
alert(pa==2); 會輸出 "in valueOf", 再輸出 "true";
如果屏蔽掉 Point.prototype.valueOf 則輸出 "in toString", 再輸出 "false";
var pa = new Point(1,0);
則 pa==true;
關系操作符 >=,<=,>,<
如果兩邊都是數字 , 或者可以轉化為數字 , 則比較數字。
如果兩邊都是 string , 或者可以轉化為 string , 則比較 string 。
如果一邊可轉為 string, 一邊可轉為 number, 則再試圖把 string 轉為 number 再比較 , 如果 string 不能轉為 number, 則為 NaN, 傳回 false.
如果有 object 參與比較 , 則總是試圖轉 object 為 number 或 string 再比較。
下面有一個有趣的例子:
function Point(x,y){
this.x = x;
this.y = y;
};
Point.prototype.toString = function(){
alert("in toString");
return "x=" + this.x + " y=" + this.y;
};
Point.prototype.valueOf = function(){
alert("in valueOf");
return this.x+this.y;
};
var pa = new Point(1,1);
var pb = new Point(1,1);
則 (pa==pb)==false;
(pa>pb)==false;
(pa<pb)==false;
但是:
(pa>=pb) == true;
(pa<=pb) == true;