1.引用類型有哪些?非引用類型有哪些
引用類型是指那些保存在堆內(nèi)存中的對象,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對象。
非引用類型是指保存在棧內(nèi)存中的簡單數(shù)據(jù)段。
- 非引用類型:數(shù)值,布爾,字符串,null和undefined
- 引用類型:對象,數(shù)組,函數(shù),正則表達(dá)式
2.如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false ,因?yàn)閮蓚€(gè)對象的存儲地址不相同
console.log(obj1 = obj2); //Object {a: 1, b: 2} obj2地址賦給了obj1
console.log(obj1 == obj2);//true, 兩個(gè)對象指向地址相同
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 } var cc = c 是將c的對象地址賦給cc,var d = [a, b, c]也是將c對象的地址賦值給d數(shù)組中的c變量,var dd = d是將d的數(shù)組地址復(fù)制給dd;所以任意對c的改變都會反應(yīng)到有c的地址的對象中。
console.log(dd)//[1, 2, { name: 'hello', age: 3 }]// 基本類型直接賦值,dd中的a b為初始a b的值
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 沒有函數(shù)對a進(jìn)行增減,f1只是讀取a的值,復(fù)制給了n,n!=a
console.log(c); // Object {name: "jirengu", age: 3} f2函數(shù)讀取了c對象的地址,并且將對應(yīng)地址的age的值+1; f1函數(shù)只是讀取了c對象age的值,復(fù)制給了n.
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--;
}
}
return arr;
}
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 b = [];
var k = 0;
for (i in arr) {
if (arr[i] > 0) {
b[k] = arr[i];
k++;
}
}
return b
}
var arr2 = filter(arr);
console.log(arr2); // [3,1,2]
console.log(arr); // [3,1,0,-1,-2,2,-5]
7.寫一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
方法1:
var arr = [3,1,0,-1,-3,2,-5,[1,2]];
function deepCopy(obj) {
var b = [];
for (key in obj) {
if (typeof obj[key] === 'object'){
b[key]=deepCopy(obj[key]);
}else if(typeof obj[key] === 'number'||typeof obj[key] === 'string'||typeof obj[key] === 'boolean'||obj[key] === undefined || obj[key] === null){
b[key]=obj[key];
}
}
return b;
}
var arr2 = deepCopy(arr);
arr[7][1]=6;
console.log(arr2) ;// [ 3, 1, 0, -1, -3, 2, -5, [ 1, 2 ] ]
console.log(arr) ; //[ 3, 1, 0, -1, -3, 2, -5, [ 1, 6 ] ]
方法2:
var arr = [3,1,0,-1,-3,2,-5,[1,2]];
var b = JSON.parse( JSON.stringify(arr) );
arr[7][1]=6;
console.log(b) ;// [ 3, 1, 0, -1, -3, 2, -5, [ 1, 2 ] ]
console.log(arr) ; // [ 3, 1, 0, -1, -3, 2, -5, [ 1, 6 ] ]