上一篇文章提到了javascript中可變值與不可變值,如果你不知道什麼是可變值和不可變值,可以先去看看那篇文章,再回來看這篇,因為這篇文章是基於可變值與不可變值講解的。 那我就預設你知道什麼是可變值與不可變值。 1.對於不可變值來說(也就是數字,字元串,布爾,null,undefined),它們是
上一篇文章提到了javascript中可變值與不可變值,如果你不知道什麼是可變值和不可變值,可以先去看看那篇文章,再回來看這篇,因為這篇文章是基於可變值與不可變值講解的。
那我就預設你知道什麼是可變值與不可變值。
1.對於不可變值來說(也就是數字,字元串,布爾,null,undefined),它們是比較值是否相等,如果值是相等的那麼它們就是相等的。
2.但對於可變值來說(對象,數組),它們顯然比較值不太合適,因為它們的值是可以改變的,所以javascript為了避免這種情況的發生,把它們的比較規則修改成比較引用是否相同也就是說看它們是否是同一個東西創建出來的,如果是那麼它們就相等。
1 var a = [];
2 var b = a;
3 a[0]=2;
4 console.log(a); >>[2]
5 console.log(b); >>[2] 同時也把b的值也修改了,因為數組是可變的類型(也就是我們常說的引用類型)。
6 console.log(a==b); >>true
7 console.log(a===b); >>true
、、、、、、、、、、、、、、、、、、、、、、、、
1 var a = "11";
2 var b = a;
3 a = "22";
4 console.log(a); >>"22"
5 console.log(b); >>"11"
6 console.log(a==b); >>false
7 console.log(a===b); >>false
上面我們只是說了相同類型的值的比較,那麼如果是對象與原始值那麼它們是怎麼樣比較的呢?相當於上面的那些它們的比較要複雜一些,如果按照轉換的次數來分的話,相同類型的數據比較只需要轉換一次,而不同類型的比較則需要轉換兩次,當然不同類型的轉換可能不只是兩次,我只是說的大多數情況。
1 var a = 1;
2 var b = [1];
3 console.log(a==b); >>true
1 var a = "1";
2 var b = [1];
3 console.log(a==b); >>true
1 var a = 1;
2 var b = [1];
3 var c = b.toString();
4 console.log(typeof b); >>object
5 console.log(typeof c); >>string
6 console.log(a==c); >>true
這裡數組進行了隱式轉換,調用了toString();為什麼調用toString()因為數組也是對象,對象是調用這個進行轉換成原始值的,如果不是對象那就是調用普通的String、Number方法;
轉換過程如下:
1.首先將調用toString轉換b,轉換後的b="1";
2.現在b是一個普通的字元串也就是原始值,那麼現在就可以調用Nubmer來轉換了,最後就成了數字1;
更多關於toString方法的詳細說明看對象、數組轉換字元串的方法