淺拷貝沒那麼簡單

2021-09-11 12:48:54 字數 1843 閱讀 8828

淺拷貝: 只能對基本型別的值拷貝,如果所要拷貝的物件的某個屬性的值是物件的話,那麼目標物件拷貝得到的是這個物件的引用。

在寫這篇部落格之前,看了很多部落格實現的淺拷貝,發現大家實現的方法或多或少都有些不足,今天就把這些坑說一說。

通過逐個遍歷物件的屬性並複製,來實現淺拷貝,但這種方法有兩個弊端:

symbol 作為屬性名,該屬性不會出現在for...in、for...of迴圈中,也不會被object.keys()、object.getownpropertynames()、json.stringify()返回。

// 淺拷貝函式

function

shallowclone(obj) ;

for (let i in obj)

return newobj;

}// 被拷貝物件

const obj1 =

object.defineproperty(obj1, 'f', ) // 新增不可列舉屬性

const obj2 = shallowclone(obj1);

obj2 //

複製**

所拷貝的物件並沒有以symbol為屬性名的屬性,也不能拷貝不可遍歷的屬性,所以這種方法並不是最佳實踐。

es6新增了許多操作物件或者遍歷物件的api,下面分別測試下能不能實現完美的淺拷貝

通過和空物件合併來實現淺拷貝:

const obj1 = 

const obj2 = object.assign({},obj1) // es6新擴充套件: object.assign()

obj2 //

複製**

發現可以實現對以symbol為屬性名的屬性的拷貝,但是對於不可列舉屬性object.assign()還是無能為力。 我們在mdn上發現object.assign()不可以遍歷出不可列舉屬性:

object.assign() 方法用於將所有可列舉屬性的值從乙個或多個源物件複製到目標物件。它將返回目標物件。

那我們看看更加優雅的解構賦值+rest能不能實現完美的淺轉殖通過es6的解構賦值可以更簡單的實現淺拷貝:

const obj1 = 

object.defineproperty(obj1, 'f', );

let = obj1

obj2 //

複製**

發現依然不能解決不可遍歷屬性的問題。

object.getownpropertydescriptor() 方法返回指定物件上乙個自有屬性對應的屬性描述符。(自有屬性指的是直接賦予該物件的屬性,不需要從原型鏈上進行查詢的屬性)

object.getownpropertydescriptors方法可以配合object.create方法實現淺拷貝

const shallowclone = (obj) =>

object.create(

object.getprototypeof(obj),

object.getownpropertydescriptors(obj)

);const obj1 =

object.defineproperty(obj1, 'f', );

const obj2 = shallowclone(obj1);

obj2 //

複製**

基本上完美實現了對所有型別屬性的拷貝,可以看見即使是淺拷貝,要踩得坑還是很多的。

移動辦公沒那麼簡單,也沒那麼難

一提起移動辦公,大家想到的就是用手機,用筆記本處理繁瑣的工作,這只是簡單的一方面,並不是移動辦公的全部,乙個正確的載體出現了,把工作的每乙個流程,每乙個細節整合起來放到乙個固定的系統上,在通過系統分解到每乙個專案流,每乙個成員上,按照工作流操作日常繁瑣的工作,最後形成閉環以資料的形式呈現給企業管理者...

辭職創業?沒那麼簡單

當你辭去工作開始創業時,就好比在茫茫的海 你拋棄遊輪轉而乘坐小艇去尋求刺激,這看起來像是一場迷人的冒險,但是一旦遇到暴風雨或鯊魚時,你隨時會有生命危險。所以,想創業?請捫心自問,確定自己要創業的原因。如果以下是你辭職創業的原因,那麼請默默儲存自己的憂傷,要麼尋找乙個更好的工作,要麼繼續埋頭工作。創業...

棋牌運營起來沒那麼簡單!!

遊戲行業競爭異常激烈。有著印鈔機之稱的棋牌遊戲吸引了無數的投資者,越來越多的棋牌遊戲開發商想從中分得一杯羹。然而,現在國內市場上的穩定安全的棋牌平台並不多。棋牌遊戲並不只是簡簡單單的開發而已,棋牌運營也極為重要。第一 以市場為導向準確運營方案。棋牌遊戲開發公司要明確自身棋牌遊戲平台的長板與短板,採取...