17-引用類型、拷貝對象

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

(1)引用類型:指的是那些保存在堆內(nèi)存中的對象,變量中保存的實際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象

  • 對象
  • 數(shù)組
  • 函數(shù)
  • 正則

(2)基本類型:指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段

  • 數(shù)值
  • 布爾值
  • null
  • undefined

2.如下代碼輸出什么? 為什么

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: 2 }
console.log(dd) //[1,2,{name: 'hello', age: 3}]

原因:

  • a,b都是基本類型,aa=a只是在內(nèi)存中開辟了一塊新空間,并不會相互影響,所以一開始aa的值就是1,和后面a重新賦值沒有關(guān)系。b也同理。
  • 但是c和d不一樣,數(shù)組和對象都是引用類型,原來的c中存儲的是這個對象的指針,而c.name = ‘hello’ 是改變了指針?biāo)竷?nèi)容的值,所以c要變。d也是同理

3.如下代碼輸出什么? 為什么

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 }

原因:
f1(a)在執(zhí)行的時候會變成

function f1(a){
    var n = a;
    ++n;
}

這時候a的值并沒有改變。而c是引用類型,執(zhí)行f2(c)。復(fù)制的是指針,所以要變化。c.age是基本類型,不會變化。


3.過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作

<script>
    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 = i-1;
            }
        }
    }
    filter(arr)
    console.log(arr) // [3,1,2]
</script>

4.過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組

<script>
    var arr = [3,1,0,-1,-3,2,-5]
      function filter(arr){
        var a1 = new Array();
        for(var i = 0;i<arr.length;i++){
            if(arr[i]>0){
                a1.splice(i,0,arr[i]);
            }   
        }
        return a1;
    }
    var arr2 = filter(arr)
    console.log(arr2) // [3,1,2]
    console.log(arr)  // [3,1,0,-1,-2,2,-5]
</script>

5.寫一個深拷貝函數(shù),用兩種方式實現(xiàn)

  • 第一種:JSON
<script>
 function deepCopy(obj){
    return JSON.parse(JSON.stringify(obj));
 }
</script>
  • 第二種:遞歸
<script>
 function deepCopy(obj){
    var newObj = {};
    for(var i in obj){
        if(typeof obj[i] === 'object' && obj[i] !== null){
            newObj[i] = deepCopy(obj[i]);
        }else{
            newObj[i] = obj[i];
        }
    }
    return newObj;
 }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容