1.引用類型有哪些?非引用類型有哪些
- 基本類型值(數(shù)值杨伙、布爾值形庭、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段箩溃;
- 引用類型值(對象路媚、數(shù)組熊赖、函數(shù)堵漱、正則):指的是那些保存在堆內(nèi)存中的對象周拐,變量中保存的實際上只是一個指針遗增,這個指針執(zhí)行內(nèi)存中的另一個位置执解,由該位置保存對象。
2.如下代碼輸出什么哲身?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
console.log(obj1 == obj2);
輸出false,因為兩個引用類型的值雖然內(nèi)容一樣但指向不同的對象贸伐,指針不相等勘天。
console.log(obj1 = obj2);
輸出[object Object] { a: 1, b: 2},相當于把obj2的指針賦值給obj1捉邢,再輸出指針指向的對象脯丝。
console.log(obj1 == obj2);
輸出true,由于上句中已經(jīng)把obj2的指針賦值給obj1伏伐,故此時兩者指向同一位置宠进,指針相同,故輸出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)
console.log(bb)
console.log(cc)
console.log(dd)
console.log(aa)
輸出1材蹬,因為a把它的值1賦給了aa,aa是基本類型值不隨a的值變化而變化吝镣。
console.log(bb)
輸出2堤器,理由同上。
console.log(cc)
輸出[object Object] { name: 'hello', age: 3 }末贾,因為c是引用類型值闸溃,c與cc指向同一個值,c變化了cc跟著變化拱撵。
同時c還是數(shù)組d中的一項辉川,d[2]['age']與c.age指向同一個值。故d的變化能反映到cc上拴测。
console.log(dd)
輸出[1,2,[object Object] { 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)
console.log(c)
console.log(a)
輸出1昼扛,基本類型值不會因傳參而發(fā)生改變寸齐。
console.log(c)
輸出[object Object] { name: 'jirengu', age: 3 }欲诺。
引用類型值c傳參把地址傳入函數(shù)f2,f2修改了該地址上的age值渺鹦,故c的值也發(fā)生改變扰法。但f1函數(shù)傳入的是基本類型值,不會影響c原本的值毅厚。
5.過濾如下數(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--;
}
}
}
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 newarr = [];
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
newarr.push(arr[i]);
}
}
return newarr;
}
var arr2 = filter(arr);
console.log(arr2); // [3,1,2]
console.log(arr); // [3,1,0,-1,-2,2,-5]
7.寫一個深拷貝函數(shù)咽安,用兩種方式實現(xiàn)
遞歸方法:
var aaa = {
name: 'franky',
age: 100,
sex: 'male',
friend: {
name: 'xxx',
age: 25,
sex: 'female'
}
};
function copy(obj){
//新建一個對象
var newObj={};
//遍歷傳入對象屬性
for(var key in obj){
// 判斷傳入對象實例中是否有該屬性
if(obj.hasOwnProperty(key)){
// 判斷屬性是不是基本類型
if(typeof obj[key] === 'number' ||
typeof obj[key] === 'string'||
typeof obj[key] === 'boolean' ||
obj[key] === undefined||
obj[key] === null){
// 把基本類型值賦值給新對象
newObj[key] = obj[key];
}
// 引用類型的值通過遞歸再次執(zhí)行一次copy函數(shù)
else{
newObj[key] = copy(obj[key]);
}
}
}
return newObj;
}
var bbb = copy(aaa);
console.log(bbb);
JSON方法:
var aaa = {
name: 'franky',
age: 100,
sex: 'male',
friend: {
name: 'xxx',
age: 25,
sex: 'female'
}
};
JSON.stringify(aaa);
var bbb = JSON.parse(JSON.stringify(aaa));
console.log(bbb);