1.引用類型有哪些?非引用類型有哪些言询?
引用類型:對(duì)象俯萎、數(shù)組、函數(shù)运杭、正則表達(dá)式
非引用類型:數(shù)值夫啊、字符串、布爾值辆憔、null撇眯、undefined
基本類型:指的是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段
引用類型:保存在堆內(nèi)存中的對(duì)象,變量中保存的實(shí)際上只是一個(gè)指針虱咧,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置熊榛,由該位置保存對(duì)象
2.如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false 指向的地址不一樣
console.log(obj1 = obj2); //{a:1,b:2} 將obj2賦值給obj1腕巡,指向了同一個(gè)地址
console.log(obj1 == obj2); //true 指向的地址是同一個(gè)
輸出結(jié)果:false {a:1,b=2} true
3.如下代碼輸出什么玄坦?為什么
var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 } //0xx11
var d = [a, b, c] //0xx22
var aa = a //1
var bb = b //2
var cc = c //0xx11
var dd = d //0xx22
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3
console.log(aa) //1
//a=1,把a(bǔ)賦值給aa绘沉,aa=1
console.log(bb) //2
//b=2煎楣,把b賦值給bb,bb=2
console.log(cc) // {name:"hello",age: 3}
//把c的值賦給cc车伞,cc就和c指向同樣的地址择懂;c.name='hello',c的name值發(fā)生變化,cc的name值也跟著一起變化帖世; d[2]['age'] = 3休蟹,改變的是c的age值沸枯,cc和c指向同樣的地址,所以cc的age值也發(fā)生變化
console.log(dd) // [1, 2, {name:"hello",age: 3}]
//d=[1,2,{ name: '饑人谷', age: 2 }]赂弓,把d的值賦給dd绑榴,dd就和d指向同樣的地址;c.name='hello',c的name值發(fā)生變化盈魁,d和dd中的name也跟著發(fā)生變化翔怎,然后d[2]['age'] = 3,d和dd中的age也隨著變成3
輸出結(jié)果:1 2 {name:"hello",age: 3} [1, 2, {name:"hello",age: 3}]
4.如下代碼輸出什么杨耙?為什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){ //把a(bǔ)的值復(fù)制給n赤套,n=a; 把c.age的值賦給n,n=c.age
++n //2 4
}
function f2(obj){ //把c的值賦給obj珊膜,obj=c;
++obj.age //{ name: 'jirengu', age: 3 }
}
f1(a)
f2(c)
f1(c.age) //把c.age的值賦給n容握,n的值發(fā)生了變化,對(duì)c.age沒(méi)有影響
console.log(a) //1
//a的值賦給n车柠,n發(fā)生變化剔氏,a沒(méi)有變化,a的值為1
console.log(c) //{ name: 'jirengu', age: 3 }
////把c的值賦給obj竹祷,obj和c指向同樣的地址谈跛,obj.age發(fā)生變化,c.age也跟著變化
輸出結(jié)果: 1 { name: 'jirengu', age: 3 }
5.過(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--;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.過(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++){
arr2[i] = arr[i];
}
for(var i = 0; i < arr2.length; i++){
if(arr2[i] <= 0){
arr2.splice(i,1);
i--;
}
}
return arr2;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
7.寫(xiě)一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
function deepCopy(){
var obj2={};
for(var key in obj){
if(obj.hasOwnProperty[key]){
if(typeof obj[key] === "number" || typeof obj[key] === "boolean"
|| typeof obj[key] === "string" || obj[key] === null || obj[key] === undefined){
obj2[key] =obj[key];
}else{
obj2[key] = deepCopy(obj[key]);
}
}
}
return obj2;
}
function deepCopy(obj){
var obj2={};
obj2=JSON.parse(JSON.stringify(obj));
return obj2;
}