javascript將數據類型分爲兩類:原始值(undefined、null、布爾值、數字和字符串),對象(對象、函數和數組)javascript
論點:原始值不能夠改變,對象能夠改變;對象爲引用類型;java
'原始值不能夠改變'不能夠改變,若是動腦筋的同窗確定會懷疑了,大家字符串能夠改變啊,不信你瞅下面的數組
var a = 'aa'; alert(a.toUpperCase());//彈出 AA
其實,這些只是表面現象,原始值字符串'a'其實並未發生改變,只是拷貝了一份而後對新的拷貝使用'toUpperCase'函數而已,有下面代碼爲證併發
var a = 'aa'; a.toUpperCase(); alert(a);//彈出'aa'
瞅着了吧,其實字符串'a'並無發生變化函數
原始值的比較是值得比較,他們值相等時才相等。this
對象和原始值不一樣,他們的值能夠修改,以下spa
var obj = {'a' : 1, 'b' : 2}; obj.a = 3; obj.b = 4; var arr = [1, 2, 3]; arr[0] = 4;
對象的比較併發值得比較,即便兩個對象包含一樣的屬性和值,它們也是不相同的code
奉上如下代碼爲證:對象
var a = {'x' : 1}, b = {'x' : 1}; alert(a === b);//false var c = [1], d = [1]; alert(c === d);//false
對象的值都是引用,對象的比較均是引用的比較,當且僅當它們引用同一個基對象時,它們才相等blog
'對象的值都是引用' 奉上以下代碼覺得證
var a = {'x' : 1}; var b = a; a.x = 2; alert(b.x);// 彈出2 var c = function(){ this.x = 1; } var d = new c; var e = d; d.x = 3; alert(e.x);//彈出3 var aa = [1, 2, 3]; var bb = aa; aa[0] = 11; alert(bb[0]);//彈出 11
'對象的比較均是引用的比較,當且僅當它們引用同一個基對象時,它們才相等' 奉上以下代碼爲證
var a = [1, 2, 3]; var b = a; a[1] = 5; alert(a === b);//彈出true var aa = [1, 2, 3]; var bb = [1, 2, 3]; alert(aa === bb);//彈出false
如咱們上面的論述,對象的賦值只是賦值的引用,並無進行任何拷貝,若是你想要獲得一個拷貝的副本,則必須顯式的爲對象的每一個屬性或數組的每一個元素進行拷貝,以下
var a = [1, 2, 3, 4, 5]; var b = []; for(var i =0, _len = a.length; i < _len; i++){ b[i] = a[i]; }
一樣的若是咱們想要對比兩個數組或者對象,必須將數組或對象的每一個元素或屬性進行比較
鄙人才疏學淺,有不足之處,歡迎補足!