-
引用類型有哪些?非引用類型有哪些
引用類型:
(對(duì)象仿野,數(shù)組铣减,函數(shù),正則):指的是那些保存在堆內(nèi)存中的對(duì)象脚作,變量中保存的實(shí)際上只是一個(gè)指針葫哗,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對(duì)象球涛。
非引用類型:
(Number,String,Boolean,Null,Undefined):指的是保存在棧內(nèi)存中的簡(jiǎn)單數(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í)候會(huì)開辟出一個(gè)新的內(nèi)存空間亿扁,將值賦值到新的內(nèi)存空間捺典,賦值完成之后如果再次改變?cè)瓉淼腶,b的值,這時(shí)候只會(huì)改變?cè)瓉淼腶和b的值从祝,而不會(huì)影響到已經(jīng)賦值到新內(nèi)存中的值即aa和bb襟己,所以console.log(aa)輸出為1,console.log(bb)輸出為2牍陌。
c和d是引用類型擎浴,把c賦值給cc,賦值的只是指向存儲(chǔ)對(duì)象內(nèi)存的地址即賦值的是地址毒涧!所以賦值完成之后贮预,改變c的值時(shí),cc中的值也同樣會(huì)改變契讲。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í)候會(huì)隱式的創(chuàng)建一個(gè)局部變量茫藏,這個(gè)局部變量的值就是傳入?yún)?shù)的值,所以以上代碼會(huì)變成下面這樣:
function f1(a) {
var n = a;
++n // 執(zhí)行到這里時(shí)n變?yōu)?霹琼,a的值不變务傲。因?yàn)閍是基本類型,當(dāng)把a(bǔ)賦值給b后枣申,b的值改變時(shí)售葡,a的值不會(huì)受影響。
}
function f2(c) {
var obj = c;
++obj.age //相當(dāng)于++c.age忠藤,此時(shí)c.age的值變?yōu)?挟伙;這是因?yàn)閏是引用類型,當(dāng)把c賦值給obj模孩,賦值的是一個(gè)地址尖阔,即指向該存儲(chǔ)數(shù)據(jù)內(nèi)存空間的地址贮缅。所以當(dāng)obj.age改變時(shí)c.age也會(huì)跟著改變。
}
function f1(c.age) {
var n = c.age; // n =3;
++n; // n=4,c.age不變介却。因?yàn)閏.age的值是基本類型谴供,把c.age賦值給n,n改變但c.age不會(huì)改變齿坷。
}
-
過濾如下數(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)載須說明來源