(前端進階一)調用堆棧

1、函數的值傳遞和引用傳遞

1. 函數的參數若是是基本的數據類型就會生成一個副本傳到函數內部
2. 函數的參數若是是引用數據類型就把引用數據類型的內存地址傳到函數內部

2、函數的arguments詳解

1. 參數的分配都是從左到右的

多餘的實參會被arguments接受

多餘的形參都被看成undefined處理

總結:

1. 引用傳遞的參數,是傳遞引用對象的內存地址 函數內部修改會影響到傳遞參數的引用對象

2. 值傳遞的是一個值類型的副本函數內部並不影響外部傳遞的參數變量

深拷貝:
方法一: 
var xm = {
    age:18,
    score:4
}

function deepCopy(obj){
    var str,newobj = obj.constructor === 'Array'?[]:{}
    if(typeOf(obj) === 'Object’){
        return obj;
    }else if(window.JSON){
        str = JSON.stringify(obj);
        newobj = JSON.parse(str);
    }else{
        for(let i in obj){
            newobj[i] = typeOf(obj) === 'Object'?deepCopy(obj):obj[i]
        }
    }
    return newobj;
 }

var xh = deepCopy(xm);

Conosole.log(xh.age === xm.age);
Console.log(xh === xm);



方法二:Object.assign()
1. 當對象只有一級屬性的時候沒有二級屬性的時候 此方法就是深拷貝 
2. 可是當對象中存在對象的時候此方法就被稱爲淺拷貝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = Object.assign({}, obj1);
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }


方法三:經過jQuery的extend方法實現深拷貝
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);


方法四:lodash很熱門的函數庫,提供了 lodash.cloneDeep()實現深拷貝

淺拷貝的案例:數組複製淺拷貝存在必定問題 
拷貝的和被拷貝的數組會相互影響
相關文章
相關標籤/搜索