js 物件的深轉殖

2022-09-16 13:30:14 字數 2174 閱讀 9457

前端筆試或者面試的時候,很喜歡問的乙個問題就是物件的深度轉殖,或者說是物件的深度複製。其實這個問題說容易很容易,但是要說全面也挺不易。

要弄明白物件的轉殖,首先要明白js中物件的組成。在js中一切例項皆是物件,具體分為原始型別和合成型別。原始型別物件指的是number、string、boolean等,合成型別物件指的是array、object以及function。

又或許你剛聽說「深度轉殖"這個詞,簡單來說,就是說有個變數a,a的值是個物件(包括基本資料型別),現在你要建立乙個變數b,使得它擁有跟a一樣的方法和屬性等等。但是a和b之間不能相互影響,即a的值的改變不影響b值的變化。

直接賦值可好?

var a = 1;

var b = a;

a = 10;

console.log(b); // 1

var a = 'hello';

var b = a;

a = 'world';

console.log(b); // hello

var a = true;

var b = a;

a = false;

console.log(b); // true

實踐證明某些j**ascript的原始資料型別,如果要轉殖直接賦值即可。

關於function的深度複製:查閱了一些資料,function的深度複製似乎和原始資料型別的深度複製一樣。

var a = function() ;

var b = a;

a = function() ;

b(); // 1

本來我也是這麼認為的,思考後我覺得function和普通的物件一樣,只是我們在平常應用中習慣了整體的重新賦值,導致它在深度複製中的表現和原始型別一致:

var a = function() ;

a.tmp = 10;

var b = a;

a.tmp = 20;

console.log(b.tmp); // 20

於是乎對於function型別的深度轉殖,直接賦值似乎並不應該是一種最好的方法(儘管實際應用中足矣)。那麼如何轉殖?

function clonefunction(f)

} // 原型

tmpf.prototype = f.prototype;

return tmpf;

}

其實這裡是不太嚴謹,比如,如果函式下屬性p還是物件,這種情況就需要遞迴copy,這裡只是簡單闡述情景;類似的還有number、string、boolean通過new出來的物件;也是一樣的情景;

但是合成型別物件array、object呢?

var a = [0, 1, 2, 3];

var b = a;

a.push(4);

console.log(b); // [0, 1, 2, 3, 4]

顯然與預期不符,為什麼會這樣?因為原始資料型別儲存的是物件的實際資料,而物件型別儲存的是物件的引用位址。上面的例子呢也就是說a和b物件引用了同乙個位址,無論改變a還是改變b,其實根本操作是一樣的,都是對那塊空間位址中的值的改變。

於是我們知道了,對於基本的物件來說,不能只能用=賦值,思索後寫下如下**:

function deepclone(obj) ;

for(var k in obj)

}o .prototype = obj.prototype;

return o;

}var a = [[1, 2, 3], [4, 5, 6, 7]];

var b = deepclone(a);

console.log(b);

另外一種簡單實現:

// 深複製

let deepclone= (obj) => ;

似乎可以解決一般的物件(包括array)的深度轉殖了,或許這兒會有疑問,new string(..)這類的也是物件啊,可是這樣寫你轉殖不了啊...但是樓主覺得深度轉殖的考點不在這裡,可能在於:

原始資料型別的直接賦值

function的exception

物件的深度轉殖中array型別的判斷

轉殖函式的遞迴呼叫

js 轉殖 淺轉殖 深轉殖)

淺轉殖var obj var obj1 function clone origin,target return target clone obj,obj1 obj1.name ge console.log obj1.name ge console.log obj.name chen obj1.car...

js深轉殖深拷貝

不足之處是不能拷貝函式,但是基本夠用 const deepcopy obj json parse json stringify obj 如果涉及拷貝函式 簡單一點 function copy object for const k,v of object.entries object return o...

JS如何進行物件的深轉殖(深拷貝)

js中,一般的賦值傳遞的都是物件 陣列的引用,並沒有真正的深拷貝乙個物件,如何進行物件的深拷貝呢?var a var b a b.name jone console.log a.name jone 上述 中,b指向a所指向的棧物件,也就是說a,b指向同乙個棧物件,這種屬於物件的淺拷貝。var a v...