天天看點

js基本類型、對象的各自比較

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;