不造你有沒有這樣把js數據類型分類,不造你是否知道各種數據類型是怎樣賦值怎樣傳遞的,所有的不造,看了這篇就能懂了,保證小學生即可懂!
javascript將數據類型分為兩類:原始值(undefined、null、布爾值、數字和字元串),對象(對象、函數和數組)
論點:原始值不可以改變,對象可以改變;對象為引用類型;
'原始值不可以改變'不可以改變,如果動腦筋的同學肯定會懷疑了,你們字元串可以改變啊,不信你瞅下麵的
var a = 'aa'; alert(a.toUpperCase());//彈出 AA
其實,這些只是錶面現象,原始值字元串'a'其實並未發生改變,只是拷貝了一份然後對新的拷貝使用'toUpperCase'函數而已,有下麵代碼為證
var a = 'aa'; a.toUpperCase(); alert(a);//彈出'aa'
瞅著了吧,其實字元串'a'並沒有發生變化
原始值的比較是值得比較,他們值相等時才相等。
對象和原始值不同,他們的值可以修改,如下
var obj = {'a' : 1, 'b' : 2}; obj.a = 3; obj.b = 4; var arr = [1, 2, 3]; arr[0] = 4;
對象的比較併發值得比較,即使兩個對象包含同樣的屬性和值,它們也是不相同的
奉上以下代碼為證:
var a = {'x' : 1}, b = {'x' : 1}; alert(a === b);//false var c = [1], d = [1]; alert(c === d);//false
對象的值都是引用,對象的比較均是引用的比較,當且僅當它們引用同一個基對象時,它們才相等
'對象的值都是引用' 奉上如下代碼以為證
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]; }
同樣的如果我們想要對比兩個數組或者對象,必須將數組或對象的每個元素或屬性進行比較
鄙人才疏學淺,有不足之處,歡迎補足!