博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象复制
阅读量:6923 次
发布时间:2019-06-27

本文共 757 字,大约阅读时间需要 2 分钟。

声明本文摘抄《你不知道的javascript》上卷 110页。

如何复制一个对象,看起来应该有一个内置的copy()方法。实际上事情比你想象的更复杂,因为我们无法选择一个默认的复制算法。
比如下面这个对象

function fn (){}var obj = {    c: true}var array = [];var myObj = {    a: 2,    b: obj,    c: array,    d: fn};array.push(obj, myObj)

如何复制myObj对象呢?

  1. 首先我们应该判断它是浅复制还是深复制。
    对于浅复制来说,复制出的新对象中a的值会是旧对象中的值,就是2,但是新对象中b、c、d三个属性其实只是三个引用,他们和旧对象中b、c、d引用的对象是一样的。
    对于深复制来说,除了复制myObj以外还会复制obj、array.这时问题就来了,array引用了obj和myObj,所以又需要复制myObj,这样就会导致死循环。

    思考:复制一个函数意味着什么呢?有些人会通过toString()来序列化一个函数的源码(但是结果取决于js的具体实现,而且不同的引擎对于不同类型的函数处理方式并不完全相同)。

    对于JSON安全(也就是说可以被序列化为一个JSON字符串并且可以根据这个字符串解析出一个结构和值完全一样的对象)的对象来说,有一种巧妙的复制方法:

var newObj = JSON.parse(JSON.stringify(someObj));

这个方法需要保证对象是JSON安全的,所以只适用于部分情况。

相对于深复制,浅复制非常易懂而且问题少的多。所以es6定义了object.assign()方法来实现浅复制。

object.assign({}, myObj);

转载地址:http://pfujl.baihongyu.com/

你可能感兴趣的文章
关于我的第一个网站www.webtv520.com随笔
查看>>
组播实验
查看>>
空指针和野指针
查看>>
VMware虚拟机桥接方式与真实主机共享上网
查看>>
如何解决SVN Commit failed (details follow): Access denied
查看>>
最新LAMP×××网站平台PHP5.5.1 + Apache2.4.6 + mysql5.6.12
查看>>
看《中国好声音》,学职场生存铁律!
查看>>
ligerFilter.js每次打开绑定不同字段列表
查看>>
ISCSI服务的配置与管理
查看>>
greenplumn----------单机2segment安装
查看>>
第八单元系统服务的控制
查看>>
ansible编写hadoop群集
查看>>
linux云自动化运维基础知识1
查看>>
ghost系统后变成C盘了别的分区的文件怎样找到
查看>>
navicat 连接阿里云RDS的设置
查看>>
CentOS7 搭建 禅道项目管理服务
查看>>
AlphaGo Zero到底是怎么学习成为了无敌的存在?
查看>>
给人工智能「好奇心」会变成什么样?答案不出所料
查看>>
在linux下安装软件
查看>>
Java的新项目学成在线笔记-day4(六)
查看>>