1,基本類型
基本數據類型有:未定義、布爾、數字、字符串、空。基本類型存儲在堆棧區域,通過值進行訪問,這意味著您可以操作存儲在變量中的實際值。
基本類型的數據賦值時,賦予實際值,A和B不相關,B是從A復制過來的,彼此獨立。(文字量是基本類型)
var a = 10;
var b = a;
console.log(a+','+b);// 10,10
a++;
console.log(a+','+b)?//?11,10
2.參考類型
引用類型引用壹個對象。妳可以有屬性和方法,我們可以修改它們的屬性和方法。通過在堆中存儲對象變量的標記名稱和對象的存儲地址,並在堆中存儲數據,將引用對象存儲在堆棧中。
對象是通過引用分配的。當我們把壹個對象賦給壹個新的變量時,實際上是對象在堆中的地址,而不是堆中的數據。也就是說,兩個對象指向同壹個存儲空間。無論哪個對象發生變化,其實都是變化了的存儲空間的內容。因此,這兩個對象是有聯系的。
3.數組是引用類型。
我們先來看壹個例子:
var?答?=?;
var?b?=?a;
答?=?;
警戒(b);?//
就好像數組是基本類型壹樣。。,但是:
var?答?=?;
var?b?=?a;
a . pop();
警戒(b);?//
這是怎麽回事?因為:(智虎解釋)
a =;//改變的是A引用本身,數組對象不變,A和B沒有關系。
a . pop();//數組對象變了,A引用沒變。
b = a;//這個操作之後,B直接指向數組對象,而不是B指向A,A再指向數組。
//所以改變A引用不會影響B引用,但是改變數組對象可以。
這個問題和我在Reacttodo-List壹文中提到的問題是壹樣的:
var tasks = this . state . data;
tasks=tasks.filter(函數(i){
返回i.index!= taskId
});
因為filter函數返回壹個新的數組,雖然還是用任務來接收,但是此時任務指向了壹個新的數組,所以任務和數據不再相關。(concat也返回壹個新數組)
push和splice函數是對原數組進行操作的,所謂對原數組的操作是指不變性,所以任務和數據是有關聯的。
4.參數傳遞
js的函數參數作為值傳遞。
當傳入基本類型的參數時:它只是將內容復制給I,I和年齡沒有關系。
功能設置(壹)
{
警報(壹);//24
I = 18;
警報(壹);//18,I的變化不會影響外面的年齡。
};
var年齡= 24;
setAge(年齡);
警覺(年齡);//24
當傳入的參數是引用類型時:
函數集名(對象)
{
obj.name = '哈哈';
};
var obj 2 = new Object();
set name(obj 2);
alert(obj 2 . name);// ?哈哈的笑
看起來像是傳遞了壹個引用,因為obj.name被修改了,但實際上不是,它還是壹個值,因為obj2的值本身就是新對象的地址,所以這就是傳入的地址。
這是阿裏2014的測試:?
var a = 1;
var obj = {
乙:2
};
var fn = function(){ };
fn . c = 3;
功能測試(x,y,z) {
x = 4;
y . b = 5;
z . c = 6;
返回z;
}
test(a,obj,fn);
alert(a+obj . b+fn . c);
答案:12
首先,test傳入的參數中,a是基本類型(值的副本),obj是對象(指向地址,妳移動我移動),fn當然不是基本類型。執行測試時,X賦給4(和A沒關系,還是1),Y的B賦給5,obj的B變成5,Z的C變成6,fn的C當然也會是6。所以alert的結果應該是1+5+6 =12。