九 JS之 extend 之深拷貝 淺拷貝

2021-08-20 23:15:55 字數 1680 閱讀 7744

(1)$.extend()之淺拷貝

common.ajax = function

(param) , param ,

}});

$.ajax(mergeparam);

}

我們以對ajax進行二次封裝為例來進行講解淺拷貝。

上述**就是淺拷貝。mergeparam中有三個引數:timeout、param、complete,其中timeout和complete就是我們擴充套件的引數,而param就是我們呼叫ajax方法傳遞進來的引數。

對於timeout而言,它在param前面,就代表,所使用者呼叫ajax方法時傳遞的引數param中有timeout引數,則會覆蓋掉我們這裡擴充套件的timeout,使用我們傳遞進來的timeout,比如:

common

.ajax();

那麼就會覆蓋掉「timeout : 10000」。反過來說,若使用者呼叫ajax方法時傳遞的引數param中沒有有timeout引數,則會在使用者呼叫的ajax方法中加入「timeout: 2000」,比如下面:

使用者呼叫:

common.ajax();
實際效果:

common.ajax();
而對於complete而言,它在param後面,則和timeout相反,若param中有complete方法,它會覆蓋掉param中的方法,而採用我們這裡擴充套件的complete方法,若param中沒有complete方法,則會向param中新增complete方法。比如:

使用者呼叫:

common.ajax(

});

實際效果:

common.ajax(

});

補充:顯然,若使用者呼叫的ajax方法中有complete引數,卻被我們覆蓋掉了,這不是乙個我們想要的效果,在這裡我們可以做乙個判斷,若使用者呼叫的ajax方法中有complete引數,則使用使用者的,否則使用這裡的complete方法,具體判斷**如下:

if(param.complete && typeof param.complete === "function")
(2)$.extend()之深拷貝

$.extend()的深拷貝和$.extend()的淺拷貝,在方法呼叫上,深拷貝多了乙個true引數:深拷貝$.extend(true,,param)

光是方法呼叫上的區別明顯不是我想講的,真正的區別在於拷貝資料的方式不同,比如下面**:

option = 

};

若我們對option引數進行擴充套件,比如:

//深度拷貝

$.extend(true,option,data);

此時若data如下:

grid:
那麼最終得到的效果是:

option = 

};

從上面的例子我們可以看到,若是深度拷貝,它不再是簡單的資料覆蓋,而是深入到資料之中,只覆蓋或者增加與它匹配的那一項,其它的引數,它都不管。

js物件之淺拷貝和深拷貝

淺拷貝依次遍歷內容,依次賦值 var p var k console.log p console.log k for let key in p console.log p console.log k 使用object.assign 方法,這個方法的作用 問題來,你這樣依次拷貝出現的問題就是物件裡面含...

Js學習之 深拷貝與淺拷貝

1 深拷貝和淺拷貝的區別 假設有陣列物件 a 1,2,3 我們需要知道的前提是 物件的指標和實體是存在不同的地方的,所以 如果是把它賦值b a,那就是淺拷貝,相當於多了乙個指向 1,2,3 的指標b 此時不管用指標a去改變實體的內容,還是指標b去改變實體的內容,都是一樣的,例如 你改變了b 0 而a...

python之深拷貝 淺拷貝

來自於牛客網,刷題時候遇到的 題目 下面 執行後,a b c d四個變數的值,描述錯誤的是?import copy a 1,2,3,4,a b b a c copy.copy a d copy.deepcopy a 5 選項 a 1,2,3,4,a b c 5 b 1,2,3,4,a b c 5 c...