引用類型和對象拷貝

1.引用類型有哪些?非引用類型有哪些

引用類型:數(shù)組,對象,函數(shù),正則.引用類型是指實(shí)質(zhì)內(nèi)容保存在堆內(nèi)存,棧內(nèi)存只保存保存內(nèi)容的堆內(nèi)存的地址的類型.
非引用類型:數(shù)值,布爾值,undefined,null和字符串.非引用類型是指保存在棧內(nèi)存的類型.

2.如下代碼輸出什么?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false
console.log(obj1 = obj2);
console.log(obj1 == obj2);//true

obj1和obj2都是引用類型,雖然對象內(nèi)容相同,但是指向地址不同,僅僅是內(nèi)容相同,所以第一個(gè)是false.第二個(gè)是賦值,把obj2的地址賦給obj1.第三個(gè)因?yàn)榈诙€(gè)地址賦值的關(guān)系,所以是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) //1
console.log(bb) //2
console.log(cc)//{name:'hello',age:3}
console.log(dd)//[1,2,{name:'hello',age:3}]

因?yàn)閍和b是非引用類型,a和b在改變值后沒有重新賦值,所以a和b的值沒有改變,aa和bb的值也沒有改變,aa是1,bb是2.c是對象,是引用類型,c.name='hello',d[2]['age']=3改變了c的堆內(nèi)存的內(nèi)容,值也就跟著變了,所以cc是{name:'hello',age:3}.dd是數(shù)組,數(shù)組內(nèi)容是a,b,c的內(nèi)容,所以是[1,2,{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)//1 
console.log(c)//{name:'jirengu',age:3}

執(zhí)行f1()時(shí)a為參數(shù),相當(dāng)于在在函數(shù)內(nèi)部有var n = a這句話,把a(bǔ)的值賦給n,對a是沒有影響的,所以a還是1.最后在調(diào)用f1(c.age)的時(shí)候其實(shí)默認(rèn)的也是通過給var n 賦值 3,這樣即便進(jìn)行了++n的操作,但也沒有改變原始的c.age的值.
執(zhí)行f2(c)時(shí),因?yàn)閏時(shí)引用類型,相當(dāng)于把c的地址賦給了obj,所以obj.age+1后,堆內(nèi)存內(nèi)的內(nèi)容也跟著改變了,c也就跟著改變了.

5.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
filter(arr)
console.log(arr) // [3,1,2]
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 arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-3,2,-5]
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
    var narr = [];
    for (var i=0;i<arr.length;i++){
        if (arr[i]>0){
            narr.push(arr[i]);
        }
    }
    return narr;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-3,2,-5]

7.寫一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
function copy(obj) {
    var nobj = {};
    for (var key in obj){
        if (typeof obj[key] === "object"){
            nobj[key] = copy(obj[key]);
        }
        else{
            nobj[key] = obj[key];
        }
    }
    return nobj;
}
function deepCopy(obj) {
    var newObj = JSON.parse(JSON.stringify(obj));
    return newObj;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.引用類型有哪些?非引用類型有哪些 基本類型:Undefined、Null、Boolean、Number和Str...
    饑人谷_有點(diǎn)熱閱讀 204評論 0 1
  • 引用類型:Array,Function,Object,Regex.指的是那些保存在堆內(nèi)存中的對象,變量中保存的實(shí)際...
    李永州的FE閱讀 285評論 0 0
  • 引用類型有哪些?非引用類型有哪些?非引用類型有number、string、boolean、undefined、nu...
    畢子歌閱讀 254評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 引用類型有:函數(shù),對象,正則,數(shù)組 非引用類型有:數(shù)值,字符串,布爾值,un...
    annynick閱讀 358評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 引用類型:對象、數(shù)組、函數(shù)、正則表達(dá)式,指保存在堆內(nèi)存中的對象,變量中保存的...
    1w1ng閱讀 205評論 0 0