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>