引用類(lèi)型有哪些胶逢?非引用類(lèi)型有哪些?
- 引用類(lèi)型是指那些保存在堆內(nèi)存中的對(duì)象吟秩。變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置厕隧,由該位置保存對(duì)象。
- 引用類(lèi)型有:對(duì)象俄周、函數(shù)吁讨、數(shù)組、正則表達(dá)式
- 非引用類(lèi)型有: string,number,boolean,undefined和null
如下代碼輸出什么峦朗?為什么?
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);// false建丧,因?yàn)閷?duì)象是引用類(lèi)型,他們的變量保存的只是存儲(chǔ)著相同對(duì)象的地址波势,這個(gè)地址是不相同的
console.log(obj1 = obj2);//返回{a:1,b:2}翎朱,相當(dāng)于將obj2的指針傳遞給obj1,obj1也指向了obj2的堆內(nèi)存空間
console.log(obj1 == obj2);// true艰亮,因?yàn)樗麄兊闹羔樝嗤蒸妫灾赶虻亩褍?nèi)存空間也相同
如下代碼輸出什么? 為什么
var a = 1
var b = 2
var c = { name: '饑人谷', 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,aa會(huì)開(kāi)辟自己的棧空間
console.log(bb) //2迄埃,bb會(huì)開(kāi)啟自己的椓圃希空間
console.log(cc) //{name:'hello',age: 2}對(duì)象c和cc都是引用類(lèi)型,他們的指針指向同一個(gè)堆內(nèi)存空間侄非,改變其中任何一個(gè)都會(huì)改變他們共享的堆內(nèi)存空間蕉汪。
console.log(dd) //{1,2,{name:'hello',age:3}}跟上述的回答相同
如下代碼輸出什么? 為什么
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,因?yàn)閍是原始類(lèi)型,改變n的值不會(huì)影響到a
console.log(c) //輸出{name:'jirengu',age:3}流译,因?yàn)閒2(c)的執(zhí)行,會(huì)使obj中的age自增1變?yōu)?者疤,f1(c.age)不影響obj中的age福澡,因?yàn)樗皇前裲bj中的值傳給了參數(shù),這個(gè)值是原始類(lèi)型。
其實(shí)最簡(jiǎn)單的判斷方法就是觀察傳遞給函數(shù)的參數(shù)是原始類(lèi)型還是引用類(lèi)型驹马,
如果是原始類(lèi)型革砸,那么不會(huì)影響到原來(lái)的原始類(lèi)型,如果是引用類(lèi)型糯累,那么原來(lái)的引用類(lèi)型里的值也會(huì)改變算利。
過(guò)濾如下數(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);
i--;
}
}
return arr;
}
filter(arr)
console.log(arr) // [3,1,2]
過(guò)濾如下數(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.push(arr[i])
}
}
return arr2
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
寫(xiě)一個(gè)深拷貝函數(shù)缎患,用兩種方式實(shí)現(xiàn)
第一種
function deepCopy(obj){
var obj1={}
for(var i in obj){
if(obj.hasOwnProperty(i)){
if(typeof obj[i]==="number"||"boolean"||"string"|| undefined || null){
obj1[i]=obj[i];
}
else{
obj1[i]=deepCopy(obj[i]);
}
}
}
return obj1;
}
第二種
function(obj){
var objCopy=JSON.parse(stringify(obj));
return objCopy;
}