1. 引用類型有哪些?非引用類型有哪些寞埠?
引用類型值(對象屁置、數(shù)組、函數(shù)仁连、正則):指的是那些保存在堆內(nèi)存中的對象蓝角,變量中保存的實際上只是一個指針阱穗,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象使鹅;
基本類型值(number揪阶、boolean、string患朱、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段鲁僚。
2. 如下代碼輸出什么?為什么
輸出結(jié)果:
false //obj1和obj2 指向不同的內(nèi)存地址
{a:1,b:2} //將obj2賦值給obj1
true //執(zhí)行上面的賦值語句后冰沙,obj1和obj2的指針或路徑指向同樣一個堆內(nèi)存空間.
3. 如下代碼輸出什么? 為什么
輸出結(jié)果:
1 //a和aa都是數(shù)值执虹,為非引用類型拓挥,a數(shù)值的變化對aa無影響,傳值傳遞 aa=1
2 //b和bb都是數(shù)值声畏,為非引用類型,b數(shù)值的變化對bb無影響姻成,傳值傳遞 bb=1
{name: "hello", age: 3}
//c是對象插龄,即引用類型值。將c指向?qū)ο蟮闹羔樫x給cc科展,c和cc指向的其實是同一個對象均牢,
對c的修改就是對其指向的對象的修改,因此cc會保持一致的變化
[1, 2, {name: "hello", age: 3}]
// d[0]和d[1]是將a和b的數(shù)值拷貝過來才睹,
d[2]和c指向的也是同一個對象徘跪,d[2]中存儲的只是指向?qū)ο蟮闹羔?
4. 如下代碼輸出什么? 為什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a) //相當(dāng)于把a(bǔ)的值賦給n琅攘,即n==1垮庐,function f1(n) {++n}后,n===2,a===1
f2(c) //object { name: 'jirengu', age: 3 }
f1(c.age) //var n = c.age, n = 3坞琴,執(zhí)行function f1(n) {++n}后哨查,n===4,c.age===3
console.log(a)
console.log(c)
輸出結(jié)果:
1 //a是基本類型值,++n不會影響a的值
{name: "jirengu", age: 3} //c為引用類型剧辐,共用同一內(nèi)存地址寒亥,所以++obj.age使得age:3
5. 過濾如下數(shù)組,只保留正數(shù)荧关,直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var j=0;
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
arr[j]=arr[i];
j++;
}
}
arr.length=j;
}
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=[];
var j=0;
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
newArr[j]=arr[i];
j++;
}
}
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 obj1= {
name: '小明',
age:9,
hobby: ['唱歌','籃球','讀書']
}
function deepCopy(obj) {
var newObj = {}; //開辟新空間
for( var key in obj) {
//判斷有個對象是否有屬性或?qū)ο? 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];
}else {
newObj[key] = deepCopy(obj[key]);
//若對象中有嵌套,再遞歸嵌套對象的屬性
}
}
}
return newObj;
}
var obj2 = deepCopy(obj1);
console.log(obj2);
- JSON法
//利用json.stringify()將對象轉(zhuǎn)換為字符串,然后再利用json.parse()將字符串轉(zhuǎn)換為對象
function deepCopy1(obj) {
return newObj = JSON.parse(JSON.stringify(obj));
}