1.引用類型有哪些?非引用類型有哪些?
基本類型值(字符串、數(shù)值、布爾值、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
引用類型值(對(duì)象、數(shù)組、函數(shù)、正則表達(dá)式):指的是那些保存在堆內(nèi)存中的對(duì)象,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對(duì)象
2.如下代碼輸出什么?為什么?
var obj1 = {a:1, b:2};//聲明obj1,并將對(duì)象{a:1, b:2}的地址指針賦值給obj1
var obj2 = {a:1, b:2};//聲明obj2,并將另一個(gè)對(duì)象{a:1, b:2}(與上一個(gè)對(duì)象只是內(nèi)容相同,實(shí)際為兩個(gè)對(duì)象)的地址指針賦值給obj2
console.log(obj1 == obj2);//obj1與obj2為兩個(gè)不同對(duì)象的地址指針,所以不相等,結(jié)果為false
console.log(obj1 = obj2);//將obj2賦值給obj1,即是將第二個(gè)對(duì)象的指針賦值給obj1,兩者都指向第二個(gè)對(duì)象,輸出結(jié)果為第二個(gè)對(duì)象object{a:1,b:2}
console.log(obj1 == obj2);//obj1與obj2都為第二個(gè)對(duì)象的地址指針,兩者相等,結(jié)果為true
3.如下代碼輸出什么? 為什么
var a = 1;
var b = 2;
var c = { name: '饑人谷', age: 2 };
var d = [a, b, c]; //[ 1,2,c(地址指針,與c指向的對(duì)象相同)]
var aa = a; //將a賦值給aa,則aa的值為1
var bb = b; //將b賦值給bb,則bb的值為1
var cc = c; //將c賦值給cc,c是對(duì)象的地址指針,即將原對(duì)象的地址指針賦值給cc,c和cc都指向同一個(gè)對(duì)象
var dd = d; //將d賦值給dd,d是對(duì)象的地址指針,即將原對(duì)象的地址指針賦值給dd,d和dd都指向同一個(gè)對(duì)象
a = 11; //a的值改變,aa的值不變,
b = 22; //b的值改變,bb的值不變,
c.name = 'hello'; //c指向的對(duì)象的name屬性值變?yōu)椤癶ello”
d[2]['age'] = 3; //d指向的對(duì)象中第三個(gè)對(duì)象的age屬性值變?yōu)?,即是原來c指向的對(duì)象的age屬性變?yōu)?
console.log(aa) //結(jié)果為1
console.log(bb) //結(jié)果為2
console.log(cc) //結(jié)果為{ name: 'hello', age: 3 }
console.log(dd) //結(jié)果為{1,2,{ name: '饑人谷', age: 3 }}
4.如下代碼輸出什么? 為什么
var a = 1 //a的值為1
var c = { name: 'jirengu', age: 2 } // c的值為對(duì)象的地址指針
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
//f1(a){
// var n=a(n=1);
// ++n(n=2);},a的值無變化
f2(c)
//f2(c){
// var obj=c; (將c的地址指針賦值給obj,c和obj指向同一個(gè)對(duì)象)
// ++obj.age; (將cc和obj指向?qū)ο蟮腶ge屬性值自增,即為3)
// }
f1(c.age)
//f1(c.age){
// var n=c.age; (n=3)
// ++n(n=2);} c.age的值無變化
console.log(a) //1
console.log(c) //{ name: 'jirengu', age: 3 }
5.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
for(i=0;i<arr.length;i++){
if(arr[i]<=0){
arr.splice(i,1);
filter(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 j=0;
var newArr=[];
for(var i in arr){
if(arr[i]>0){
newArr[j]=arr[i];
j++;
}
}
}
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)
//第一種
function clone(obj){
var newObject={};
for (var key in obj) {
if(typeof obj[key] === 'number'||typeof obj[key] === 'boolean'||typeof obj[key] === 'string'||obj[key] ===undefined||obj[key] === null){
newObject[key]=obj[key];
} else{
newObject[key]=clone(obj[key])
}
}
return newObject;
}
第二種
var cloneObj = JSON.parse(JSON.stringify(obj));