中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)需要政府集中采購嗎免費(fèi)廣告投放網(wǎng)站

網(wǎng)站建設(shè)需要政府集中采購嗎,免費(fèi)廣告投放網(wǎng)站,傳奇怎么做網(wǎng)站,可以做qq空間背景音樂的網(wǎng)站前言 在js中我們想要實(shí)現(xiàn)深拷貝,首先要了解深淺拷貝的區(qū)別。 淺拷貝:只是拷貝數(shù)據(jù)的內(nèi)存地址,而不是在內(nèi)存中重新創(chuàng)建一個(gè)一模一樣的對象(數(shù)組) 深拷貝:在內(nèi)存中開辟一個(gè)新的存儲(chǔ)空間,完完全全…

前言

在js中我們想要實(shí)現(xiàn)深拷貝,首先要了解深淺拷貝的區(qū)別。
淺拷貝:只是拷貝數(shù)據(jù)的內(nèi)存地址,而不是在內(nèi)存中重新創(chuàng)建一個(gè)一模一樣的對象(數(shù)組)
深拷貝:在內(nèi)存中開辟一個(gè)新的存儲(chǔ)空間,完完全全的拷貝一整個(gè)一模一樣的對象(數(shù)組)

1. MessageChannel實(shí)現(xiàn)深拷貝

MDN資料:https://developer.mozilla.org/zh-CN/docs/Web/API/MessageChannel

MDN中關(guān)于MessageChannel的介紹

Channel Messaging APIMessageChannel 接口允許我們創(chuàng)建一個(gè)新的消息通道,并通過它的兩個(gè) MessagePort 屬性發(fā)送數(shù)據(jù)。

備注: 此特性在 Web Worker 中可用

使用方法:

封裝一個(gè)deepclone函數(shù)

function deppClone(obj) {return new Promise(resolve => {const { port1, port2 } = new MessageChannel()port1.postMessage(obj)port2.onmessage = e => {resolve(e.data)}})
}

測試代碼:

function deppClone(obj) {return new Promise(resolve => {const { port1, port2 } = new MessageChannel()port1.postMessage(obj)port2.onmessage = e => {resolve(e.data)}})
}
const obj = { a: "", c: undefined, e: 0, f: [], g: NaN, h: null }
obj.b = objlet newObj = null
await deppClone(obj).then(res => {newObj = res
})console.log("obj", obj)
console.log("newObj", newObj)
console.log(obj === newObj)
console.log(obj.b === newObj)
console.log(obj === newObj.b)

結(jié)果:

在這里插入圖片描述

優(yōu)點(diǎn):

他可以完美解決循環(huán)引用的問題。
支持的瀏覽器版本比較多 (文獻(xiàn)資料)

缺點(diǎn):

不支持拷貝函數(shù)
不支持拷貝Symbol

2. structuredClone實(shí)現(xiàn)深拷貝

文獻(xiàn)資料:https://developer.mozilla.org/zh-CN/docs/web/api/structuredClone

MDN中關(guān)于structuredClone()的介紹

全局的 structuredClone() 方法使用結(jié)構(gòu)化克隆算法將給定的值進(jìn)行深拷貝。

該方法還支持把原始值中的可轉(zhuǎn)移對象轉(zhuǎn)移到新對象,而不是把屬性引用拷貝過去。 可轉(zhuǎn)移對象與原始對象分離并附加到新對象;它們不可以在原始對象中訪問被訪問到。

使用方法:

structuredClone(obj)

測試代碼:

const obj = { a: "",c:undefined,e:0,f:[],g:NaN,h:null }
obj.b = objconst newObj = structuredClone(obj)console.log('obj',obj)
console.log('newObj',newObj)
console.log(obj === newObj)
console.log(obj.b === newObj)
console.log(obj === newObj.b)

結(jié)果:

在這里插入圖片描述

優(yōu)點(diǎn):

他可以完美解決循環(huán)引用的問題。
而且非常簡單,調(diào)用API即可。

缺點(diǎn):

這是一個(gè)新的API,它支持的瀏覽器版本比較新
不支持拷貝函數(shù)
不支持拷貝Symbol

在這里插入圖片描述

3.手動(dòng)封裝deepClone函數(shù)

最經(jīng)典的就是手動(dòng)封裝一個(gè)deepClone函數(shù),去主動(dòng)判斷傳入類型并且遞歸創(chuàng)建新的對象

使用方法:

封裝函數(shù),并判斷類型

function isObject(value) {const valueType = typeof valuereturn (value !== null) && (valueType === "object" || valueType === "function")
}function deepClone(originValue, map = new WeakMap()) {// 判斷是否是一個(gè)Set類型if (originValue instanceof Set) {return new Set([...originValue])}// 判斷是否是一個(gè)Map類型if (originValue instanceof Map) {return new Map([...originValue])}// 判斷如果是Symbol的value, 那么創(chuàng)建一個(gè)新的Symbolif (typeof originValue === "symbol") {return Symbol(originValue.description)}// 判斷如果是函數(shù)類型, 那么直接使用同一個(gè)函數(shù)if (typeof originValue === "function") {return originValue}// 判斷傳入的originValue是否是一個(gè)對象類型if (!isObject(originValue)) {return originValue}if (map.has(originValue)) {return map.get(originValue)}// 判斷傳入的對象是數(shù)組, 還是對象const newObject = Array.isArray(originValue) ? []: {}map.set(originValue, newObject)for (const key in originValue) {newObject[key] = deepClone(originValue[key], map)}// 對Symbol的key進(jìn)行特殊的處理const symbolKeys = Object.getOwnPropertySymbols(originValue)for (const sKey of symbolKeys) {// const newSKey = Symbol(sKey.description)newObject[sKey] = deepClone(originValue[sKey], map)}return newObject
}

測試代碼:

let s1 = Symbol("aaa")
let s2 = Symbol("bbb")const obj = {a: 18,b: {c: "www",d: {e: "www"}},// 數(shù)組類型hobbies: ["abc", "cba", "nba"],// 函數(shù)類型foo: function(m, n) {console.log("wwww")console.log("wwww")return 123},// Symbol作為key和value[s1]: "abc",s2: s2,// Set/Mapset: new Set(["aaa", "bbb", "ccc"]),map: new Map([["aaa", "abc"], ["bbb", "cba"]])
}obj.info = objconst newObj = deepClone(obj)
console.log(newObj === obj)
console.log('obj',obj)
console.log('newObj',newObj)
console.log(newObj.s2 === obj.s2)

結(jié)果:

在這里插入圖片描述

優(yōu)點(diǎn):

他可以完美解決各種問題。

4. JSON實(shí)現(xiàn)深拷貝

這是最不推薦使用的方法

優(yōu)點(diǎn):這是最簡單的方式了,只能處理不復(fù)雜的對象

const symbol1 = Symbol();
const obj = { a: "",c:undefined,e:0,f:[],g:NaN,h:null,i:symbol1 }let newObj = JSON.parse(JSON.stringify(obj))console.log('obj',obj)
console.log('newObj',newObj)

缺點(diǎn):

不能解決循環(huán)引用
在這里插入圖片描述
NaN問題

在這里插入圖片描述

忽略Symbol(),undefined

在這里插入圖片描述

5.其他

比如lodash、jQuery等插件的實(shí)現(xiàn)方式就不多講了。

http://www.risenshineclean.com/news/49101.html

相關(guān)文章:

  • 網(wǎng)站怎么上傳數(shù)據(jù)庫淺議網(wǎng)絡(luò)營銷論文
  • 網(wǎng)站創(chuàng)作情感營銷
  • 珠海網(wǎng)站建設(shè)排名含有友情鏈接的網(wǎng)頁
  • 軟件公司網(wǎng)站源碼如何做好seo優(yōu)化
  • 網(wǎng)站當(dāng)前位置 樣式手游推廣平臺
  • 淘寶客網(wǎng)站應(yīng)該怎么做網(wǎng)站安全檢測
  • 策劃一個(gè)網(wǎng)站網(wǎng)站推廣策劃方案
  • 如何做國外外貿(mào)網(wǎng)站windows優(yōu)化大師收費(fèi)嗎
  • 開封做網(wǎng)站推廣熱門關(guān)鍵詞排名查詢
  • 松崗建網(wǎng)站十八大禁用黃app入口
  • 網(wǎng)站制作咨詢電話百度引擎搜索
  • 房產(chǎn)中介如何做網(wǎng)站seo推廣服務(wù)哪家好
  • 騰訊云做淘客網(wǎng)站百度關(guān)鍵詞搜索排名代發(fā)
  • 網(wǎng)站備案密碼怎么找回自己開一個(gè)培訓(xùn)機(jī)構(gòu)流程
  • 蘇州市建設(shè)工程交易中心網(wǎng)站河南百度關(guān)鍵詞優(yōu)化排名軟件
  • 小程序怎么做微網(wǎng)站鏈接微信上如何投放廣告
  • 營銷手機(jī)網(wǎng)站seo技術(shù)自學(xué)
  • 簡述使用asp建設(shè)動(dòng)態(tài)網(wǎng)站頁面優(yōu)化
  • 招聘網(wǎng)站設(shè)計(jì)方案培訓(xùn)網(wǎng)站搭建
  • 簡約型網(wǎng)站建設(shè)站外推廣方式有哪些
  • 企業(yè)為什么做網(wǎng)站如何做網(wǎng)站賺錢
  • saas 做網(wǎng)站qq群怎么優(yōu)化排名靠前
  • 免費(fèi)個(gè)人簡歷表電子版武漢企業(yè)seo推廣
  • 做網(wǎng)站平臺成本石家莊今天最新新聞?lì)^條
  • 網(wǎng)站如何做點(diǎn)擊鏈接廣州aso優(yōu)化公司 有限公司
  • c2b模式的電商平臺網(wǎng)站有哪些好看的友情鏈接代碼
  • 友情鏈接添加在網(wǎng)站中有什么用友情鏈接交換平臺有哪些
  • 怎樣做外貿(mào)網(wǎng)站建設(shè)怎么出售友情鏈接
  • 找個(gè)網(wǎng)站開發(fā)的師傅外鏈工具xg
  • 易語言可以做網(wǎng)站后端東莞市優(yōu)速網(wǎng)絡(luò)科技有限公司