当前位置: 首页 > news >正文

网站建设需要政府集中采购吗私人网站管理软件

网站建设需要政府集中采购吗,私人网站管理软件,wordpress必备,河北省建设工程信息网站前言 在js中我们想要实现深拷贝,首先要了解深浅拷贝的区别。 浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组) 深拷贝:在内存中开辟一个新的存储空间,完完全全…

前言

在js中我们想要实现深拷贝,首先要了解深浅拷贝的区别。
浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组)
深拷贝:在内存中开辟一个新的存储空间,完完全全的拷贝一整个一模一样的对象(数组)

1. MessageChannel实现深拷贝

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

MDN中关于MessageChannel的介绍

Channel Messaging APIMessageChannel 接口允许我们创建一个新的消息通道,并通过它的两个 MessagePort 属性发送数据。

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

使用方法:

封装一个deepclone函数

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)

结果:

在这里插入图片描述

优点:

他可以完美解决循环引用的问题。
支持的浏览器版本比较多 (文献资料)

缺点:

不支持拷贝函数
不支持拷贝Symbol

2. structuredClone实现深拷贝

文献资料:https://developer.mozilla.org/zh-CN/docs/web/api/structuredClone

MDN中关于structuredClone()的介绍

全局的 structuredClone() 方法使用结构化克隆算法将给定的值进行深拷贝。

该方法还支持把原始值中的可转移对象转移到新对象,而不是把属性引用拷贝过去。 可转移对象与原始对象分离并附加到新对象;它们不可以在原始对象中访问被访问到。

使用方法:

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)

结果:

在这里插入图片描述

优点:

他可以完美解决循环引用的问题。
而且非常简单,调用API即可。

缺点:

这是一个新的API,它支持的浏览器版本比较新
不支持拷贝函数
不支持拷贝Symbol

在这里插入图片描述

3.手动封装deepClone函数

最经典的就是手动封装一个deepClone函数,去主动判断传入类型并且递归创建新的对象

使用方法:

封装函数,并判断类型

function isObject(value) {const valueType = typeof valuereturn (value !== null) && (valueType === "object" || valueType === "function")
}function deepClone(originValue, map = new WeakMap()) {// 判断是否是一个Set类型if (originValue instanceof Set) {return new Set([...originValue])}// 判断是否是一个Map类型if (originValue instanceof Map) {return new Map([...originValue])}// 判断如果是Symbol的value, 那么创建一个新的Symbolif (typeof originValue === "symbol") {return Symbol(originValue.description)}// 判断如果是函数类型, 那么直接使用同一个函数if (typeof originValue === "function") {return originValue}// 判断传入的originValue是否是一个对象类型if (!isObject(originValue)) {return originValue}if (map.has(originValue)) {return map.get(originValue)}// 判断传入的对象是数组, 还是对象const newObject = Array.isArray(originValue) ? []: {}map.set(originValue, newObject)for (const key in originValue) {newObject[key] = deepClone(originValue[key], map)}// 对Symbol的key进行特殊的处理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"}},// 数组类型hobbies: ["abc", "cba", "nba"],// 函数类型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)

结果:

在这里插入图片描述

优点:

他可以完美解决各种问题。

4. JSON实现深拷贝

这是最不推荐使用的方法

优点:这是最简单的方式了,只能处理不复杂的对象

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)

缺点:

不能解决循环引用
在这里插入图片描述
NaN问题

在这里插入图片描述

忽略Symbol(),undefined

在这里插入图片描述

5.其他

比如lodash、jQuery等插件的实现方式就不多讲了。

http://www.wooajung.com/news/28879.html

相关文章:

  • wordpress外网端口茶叶seo网站推广与优化方案
  • 律所网站建设方案书怎么写怎么投稿各大媒体网站
  • 配置无法运行wordpress优化软件刷排名seo
  • 六安网站建设青岛网站制作设计
  • 有那个网站可以做报名链接的常用网站推广方法及资源
  • 网站建设营销策划书网络营销有什么岗位
  • app网站开发成功案例西安百度推广外包
  • 学做西点的网站如何提高百度关键词排名
  • 永春网站建设友情链接只有链接
  • ppt做书模板下载网站有哪些内容seo技术软件
  • 有什么ae做动图的网站西安seo服务公司
  • 陕西网站建设公司找哪家最佳磁力吧ciliba磁力链
  • 怎么用默认程序做网站网址收录入口
  • 网站开发设计工程师免费百度下载
  • 厦门做网站哪家强品牌网络营销成功案例
  • 中建八局第一建设有限公司是国企吗旺道seo系统
  • 网站是做流程数字营销案例
  • 做网络推广选择哪个网站好免费顶级域名注册
  • 网站开发与维护宣传册成都私人做网站建设
  • wordpress和网盘结合优化器
  • 描述对于营销型网站建设很重要飘红效果更佳在线客服系统平台有哪些
  • 高端人才做兼职的招聘网站有哪些seocui cn
  • 企业网站通常包含的栏目网络推广的调整和优化
  • 武汉网站推广技巧搜索引擎广告形式有哪些
  • 精美大气的餐饮类企业网站东莞今天新增加的情况
  • 可以查授权的网站怎么做做手机关键词快速排名软件
  • 功能型网站有哪些2345浏览器导航页
  • 成都专业做网站的公司有哪些百度推广管理平台
  • 公安网站备案流程百度问答兼职怎么做
  • 四川住房城乡建设网站美国搜索引擎