-
引用類型有哪些?非引用類型有哪些
引用類型:
(對象,數(shù)組,函數(shù),正則):指的是那些保存在堆內(nèi)存中的對象,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對象。
非引用類型:
(Number,String,Boolean,Null,Undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段。
-
如下代碼輸出什么? 為什么
var a = 1
var b = 2
var c = { name: 'jirengu', age: 2 }
var d = [a, b, c]
var aa = a
var bb = b
var cc = c
var dd = d
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3
輸出:
console.log(aa) // 1
console.log(bb) // 2
console.log(cc) // {name: 'hello', age: 3}
console.log(dd) // [1, 2, {name: 'hello', age: 3}]
原因:
a, b 都是基本類型,在賦值基本類型值的時(shí)候會開辟出一個(gè)新的內(nèi)存空間,將值賦值到新的內(nèi)存空間,賦值完成之后如果再次改變原來的a,b的值,這時(shí)候只會改變原來的a和b的值,而不會影響到已經(jīng)賦值到新內(nèi)存中的值即aa和bb,所以console.log(aa)輸出為1,console.log(bb)輸出為2。
c和d是引用類型,把c賦值給cc,賦值的只是指向存儲對象內(nèi)存的地址即賦值的是地址!所以賦值完成之后,改變c的值時(shí),cc中的值也同樣會改變。dd和cc一樣同理。
-
如下代碼輸出什么?為什么?
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
f2(c)
f1(c.age)
console.log(a) // 1
console.log(c) // {name: 'jirengu', age: 3}
原因:
函數(shù)在傳遞參數(shù)的時(shí)候會隱式的創(chuàng)建一個(gè)局部變量,這個(gè)局部變量的值就是傳入?yún)?shù)的值,所以以上代碼會變成下面這樣:
function f1(a) {
var n = a;
++n // 執(zhí)行到這里時(shí)n變?yōu)?,a的值不變。因?yàn)閍是基本類型,當(dāng)把a(bǔ)賦值給b后,b的值改變時(shí),a的值不會受影響。
}
function f2(c) {
var obj = c;
++obj.age //相當(dāng)于++c.age,此時(shí)c.age的值變?yōu)?;這是因?yàn)閏是引用類型,當(dāng)把c賦值給obj,賦值的是一個(gè)地址,即指向該存儲數(shù)據(jù)內(nèi)存空間的地址。所以當(dāng)obj.age改變時(shí)c.age也會跟著改變。
}
function f1(c.age) {
var n = c.age; // n =3;
++n; // n=4,c.age不變。因?yàn)閏.age的值是基本類型,把c.age賦值給n,n改變但c.age不會改變。
}
-
過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3, 1, 0, -1, -3, 2, -5];
function filter(arr){
for(var i = 0; i < arr.length; i++){
if(arr[i] <= 0){
arr.splice(i, 1);
filter(arr);
}
}
return arr;
}
filter(arr);
console.log(arr);
-
過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組
var arr = [3,1,0,-1,-3,2,-5];
function filter(arr){
var arr2 = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] > 0){
arr2.splice(i, 0, arr[i]);
}
}
return arr2;
}
var arr2 = filter(arr);
console.log(arr2);
console.log(arr);
-
寫一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
文章著作權(quán)歸饑人谷_sunny和饑人谷所有,轉(zhuǎn)載須說明來源