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


javascript中的原始值(undefined、null、布爾值、數字和字符串)與對象(包括數組和函數)有着根本區別。原始值是不可更改的:任何方法都無法更改(或“突變”)一個原始值。對數字和布爾值來說顯然如此----改變數字的值本身就說不通,而對字符串來說就不那么明顯了,因為字符串看起來像由字符組成的數組,我們期望可以通過指定索引來假改字符串中的字符。實際上,javascript是禁止這樣做的。字符串中所有的方法看上去返回了一個修改后的字符串,實際上返回的是一個新的字符串值。

代碼如下:

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>

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

代碼如下:

 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的基本類型區分開來。依

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

代碼如下:

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM