日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

(译文)JavaScript基础——JavaScript中的深拷贝

發布時間:2024/9/5 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (译文)JavaScript基础——JavaScript中的深拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在JavaScript中如何拷貝一個對象?

通過引用調用

function mutate(obj) {obj.a = true; } const obj = {a: false}; mutate(obj) console.log(obj.a); // prints true

mutate可以對obj進行改動,然后外面的obj的值也變化了。

淺拷貝:Object.assign()

一種拷貝方式是這種方法: Object.assign(target, sources...).

const obj = /* ... */; const copy = Object.assign({}, obj);

但是這種拷貝只是淺拷貝:

function mutateDeepObject(obj) {obj.a.thing = true; } const obj = {a: {thing: false}}; const copy = Object.assign({}, obj); mutateDeepObject(copy) console.log(obj.a.thing); // prints true

JSON.parse

通過轉換為字符串,然后再轉回來:

const obj = /* ... */; const copy = JSON.parse(JSON.stringify(obj));

這樣不好的地方是你會處理一個大的字符串,并且無法處理
循環對象:

const x = {}; const y = {x}; x.y = y; // Cycle: x.y.x.y.x.y.x.y.x... const copy = JSON.parse(JSON.stringify(x)); // throws!

而且像Maps, Sets, RegExps, Dates, ArrayBuffers和其他內置對象序列化的時候可能都有問題。

結構化克隆

它是一種算法,將一個值轉換為另外一個值。而且能處理對象循環依賴和大部分的內置對象。比如調用postMessage發消息給window或者WebWorker的時候就用到。
比如像這樣:obj是被深拷貝過的

function structuralClone(obj) {return new Promise(resolve => {const {port1, port2} = new MessageChannel();port2.onmessage = ev => resolve(ev.data);port1.postMessage(obj);}); } const obj = /* ... */; const clone = await structuralClone(obj);

歷史API

如果你用過history.pushState()去構建一個單頁應用(SPA),你應該知道你可以根據當前URL保存一個state object。這個state object是結構化拷貝的,并且是同步的。

function structuralClone(obj) {const oldState = history.state;history.replaceState(obj, document.title);const copy = history.state;history.replaceState(oldState, document.title);return copy; } const obj = /* ... */; const clone = structuralClone(obj);

不好的地方是Safari限制replaceState的調用次數。

通知API

function structuralClone(obj) {return new Notification('', {data: obj, silent: true}).data; } const obj = /* ... */; const clone = structuralClone(obj);

性能如何




結論是:
1 如果你不處理對象依賴和內置對象,可以直接用 JSON.parse(JSON.stringify())

2 如果你要可靠的跨瀏覽器支持:用MessageChannel

原文:
https://dassur.ma/things/deep-copy/#call-by-reference

作者知乎/公眾號:前端瘋

轉載于:https://www.cnblogs.com/xunxing/p/a255ce21d8d85939ec4ce56def8cc0b0.html

總結

以上是生活随笔為你收集整理的(译文)JavaScript基础——JavaScript中的深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。