js 不可變的原始值和可變的對象引用

javascript中的原始值(undefined、null、布爾值、數字和字符串)與對象(包括數組和函數)有着根本區別。原始值是不可更改的:任何方法都沒法更改(或「突變」)一個原始值。對數字和布爾值來講顯然如此----改變數字的值自己就說不通,而對字符串來講就不那麼明顯了,由於字符串看起來像由字符組成的數組,咱們指望能夠經過指定索引來假改字符串中的字符。實際上,javascript是禁止這樣作的。字符串中全部的方法看上去返回了一個修改後的字符串,實際上返回的是一個新的字符串值。javascript

代碼以下:java

1 <script>
2      var s = "hello"  //定義了一個文本爲hello的字符串
3      console.log(s.toUpperCase())  //返回的是大寫的HELLO,可是並無改變字符串的S的值 
4      console.log(s)   //返回hello
5 </script>

對象和原始值不一樣,首先,它們是可變的--它們的值是可修改的數組

代碼以下:函數

 1 <script>
 2      var m = {x:1} //定義一個對象
 3      m.x = 2;   //經過修改對象的屬性值來更改對象
 4      m.y = 3;   //再次更改這個對象,給這個對象新加一個屬性
 5 
 6      var m =[1,2,3]   //定義一個數組
 7      m[0] = 3;     //對過更改數組的下標,來更改數組
 8      m[3] = 4;     //能過添加新下標,來更改數組
 9 
10 </script>

對象的比較並不是值的比較:即便兩個對象包含一樣的屬性及相同的值,它們也是不相等的。各個索引元素相等的兩個數組也不相等。this

代碼以下:spa

 1 <script>
 2      var o = {x:1}
 3      var m = {x:1}
 4      console.log(o == m)   //=> false  他們的值不相等 說明數組對象的比較並非對象值的比較
 5      console.log(o === m)  //=> false
 6 
 7      var a = []
 8      var b = []
 9      console.log(a == b)   //=> false  他們的值不相等 說明數組對象的比較並非對象值的比較
10      console.log(a === b)  //=> false
11 
12 </script>

咱們一般將對象稱爲引用類型(reference type),以此來和javascript的基本類型區分開來。依code

照術語的叫法,對象值都是引用(reference),對象的比較均是引用的比較:當且僅當它們引用同一個基對象時,它們才相等。對象

代碼以下:blog

1 <script>
2     var a = {x:1};  //聲明一個對象
3     var b= a;     //變量b引用同一個對象
4     b.x =2;        //當把對象b的x屬性改變時,引用同一個對象的a同時也會改變
5     console.log(a.x)   //=>2
6     console.log(a===b)  //=>true  此時他們相等
7 </script>
1 <script>
2     var a = [1,2,3];  //聲明一個數組對象
3     var b= a;     //變量b引用同一個數組對象
4     b[0] =5;        //當把對象b第一個索引值改變時,引用同一個數組對象的a同時也會改變
5     console.log(a[0])   //=>5
6     console.log(a===b)  //=>true  此時他們相等
7 </script>

上兩段代碼將對象(或數組)賦值給一個變量,僅僅是賦值的引用值:對象自己並無複製一次。若是你想獲得一個對象或數組的副本,則必須顯式複製對象的每一個屬性或數組的每一個元素。下面這個例子則是經過循環來完成複製索引

 1 <script>
 2    var a= [1,2,3]   //聲明一個數組a
 3    var b=[]       //聲明一個空數組b
 4    for(var i =0;i< a.length;i++){   //循環遍歷
 5        b[i] = a[i]      //把a數組裏的值傳給b
 6    }
 7    console.log(b)     //=> 1,2,3
 8    b[0] =5;         //=>當我改變b第一個索引值時
 9    console.log(a[0])   //=>此時a第一個索引值仍是等於1,由於此時b是a的副本,他們並無引用同一個數組對象。
10    console.log(a==b)   //對象的比較是引用的比較,由於他們引用的並非同一個數組對象,因此他們仍是不相等
11    console.log(a==b)
12 </script>

一樣的,若是咱們想比較兩個單獨的對象或者數組,則必須比較它們的屬性或元素。

代碼以下:

 1 <script>
 2     function arrays(a,b){
 3         if(a.length != b.length){         //先比較兩上對象的長度
 4             return false
 5         }
 6         for(var i =0; i< a.length;i++){
 7             if(a[i] != b[i]){            //再比較兩個對象上索引的值
 8                 return false
 9             }
10             return true;
11         }
12     }
13     console.log(arrays("this","this")) //=>true
14 </script>
相關文章
相關標籤/搜索