1.引用類型有哪些?非引用類型有哪些
引用類型:數(shù)組,對象,函數(shù),正則.引用類型是指實(shí)質(zhì)內(nèi)容保存在堆內(nèi)存,棧內(nèi)存只保存保存內(nèi)容的堆內(nèi)存的地址的類型.
非引用類型:數(shù)值,布爾值,undefined,null和字符串.非引用類型是指保存在棧內(nèi)存的類型.
2.如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false
console.log(obj1 = obj2);
console.log(obj1 == obj2);//true
obj1和obj2都是引用類型,雖然對象內(nèi)容相同,但是指向地址不同,僅僅是內(nèi)容相同,所以第一個(gè)是false.第二個(gè)是賦值,把obj2的地址賦給obj1.第三個(gè)因?yàn)榈诙€(gè)地址賦值的關(guān)系,所以是true.
3.如下代碼輸出什么? 為什么
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
console.log(bb) //2
console.log(cc)//{name:'hello',age:3}
console.log(dd)//[1,2,{name:'hello',age:3}]
因?yàn)閍和b是非引用類型,a和b在改變值后沒有重新賦值,所以a和b的值沒有改變,aa和bb的值也沒有改變,aa是1,bb是2.c是對象,是引用類型,c.name='hello',d[2]['age']=3改變了c的堆內(nèi)存的內(nèi)容,值也就跟著變了,所以cc是{name:'hello',age:3}
.dd是數(shù)組,數(shù)組內(nèi)容是a,b,c的內(nèi)容,所以是[1,2,{name:'hello',age:3}]
4.如下代碼輸出什么? 為什么
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}
執(zhí)行f1()時(shí)a為參數(shù),相當(dāng)于在在函數(shù)內(nèi)部有var n = a這句話,把a(bǔ)的值賦給n,對a是沒有影響的,所以a還是1.最后在調(diào)用f1(c.age)的時(shí)候其實(shí)默認(rèn)的也是通過給var n 賦值 3,這樣即便進(jìn)行了++n的操作,但也沒有改變原始的c.age的值.
執(zhí)行f2(c)時(shí),因?yàn)閏時(shí)引用類型,相當(dāng)于把c的地址賦給了obj,所以obj.age+1后,堆內(nèi)存內(nèi)的內(nèi)容也跟著改變了,c也就跟著改變了.
5.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
filter(arr)
console.log(arr) // [3,1,2]
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--;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-3,2,-5]
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var narr = [];
for (var i=0;i<arr.length;i++){
if (arr[i]>0){
narr.push(arr[i]);
}
}
return narr;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-3,2,-5]
7.寫一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
function copy(obj) {
var nobj = {};
for (var key in obj){
if (typeof obj[key] === "object"){
nobj[key] = copy(obj[key]);
}
else{
nobj[key] = obj[key];
}
}
return nobj;
}
function deepCopy(obj) {
var newObj = JSON.parse(JSON.stringify(obj));
return newObj;
}