JS 深浅拷贝

在日常开发当中那面会遇到对象拷贝问题

一、对象浅拷贝(shallowClone)

  1. 使用 Object.assign 把源对象自身的、可枚举的属性拷贝到目标对象上

    var person = {name: '张三',age: 18,sex: '男',hobbies: ['篮球', '足球', '排球'],sayName: function () {console.log(this.name);},play: null,info: {address: '四川成都',child: [{id: 1,name: '张小三',age: 5,sex: '女'}]}
    };var newPerson = Object.assign({}, person);
    console.log(newPerson);
    

    拷贝后新旧对象的对比:
    在这里插入图片描述

    但是当我操作对象里面更深层次的属性之后:
    在这里插入图片描述
    结果把源数据给改了
    在这里插入图片描述

  2. 使用 for in 遍历拷贝

    function shallowClone(target, origin) {var tar = target || {};for (var key in origin) {// 过滤原型上的属性origin.hasOwnProperty(key) && (target[key] = origin[key]);}return tar;
    }
    

二、深拷贝(deepClone)

  1. 使用 for in 循环遍历 + 递归

    • 判断是不是原型上的属性
    • 判断是引用值(注意:typeof null === 'object')还是原始值
    • 如果是引用值就递归继续拷贝,否则就直接拷贝
    • 把拷贝好的对象 return 出去
    function deepClone(target, origin) {var target = target || {},toStr = Object.prototype.toString,arrType = '[object Array]';for (var key in origin) {if (origin.hasOwnProperty(key)) {if (typeof origin[key] === 'object' && origin[key] !== null) {target[key] = toStr.call(origin[key]) === arrType ? [] : {};deepClone(target[key], origin[key]);} else {target[key] = origin[key];}}}return target;
    }
    

    当我操作拷贝之后的对象:
    在这里插入图片描述
    结果源对象不会发生改变:
    在这里插入图片描述

  2. 简单粗暴直接 JSON.parse(JSON.stringify(originObj));

    function deepClone(target, origin) {var target = target || {};target = JSON.parse(JSON.stringify(origin));return target;
    }
    

    记得初学的时候,以为一个对象赋值另一个空对象(newObj = originObj)就可以达到拷贝的效果,结果后来操作被赋值的那个对象之后,没想到源对象也修改了(后来才知道因为它俩用的是同一个引用地址的东西,呜呜呜~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 查询速度慢与性能差的原因与解决方法

MySQL 查询速度慢与性能差的原因与解决方法 更新时间:2019年09月26日 18:05:47 作者:Microtiger 随着网站数据量与访问量的增加,MySQL 查询速度慢与性能差的问题就日渐明显,这里为大家分享一下解决方法,需要的朋友可以参考下 一…

mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

跨数据库服务器,跨实例访问是比较常见的一种访问方式,在Oracle中可以通过DB LINK的方式来实现。对于MySQL而言,有一个FEDERATED存储引擎与之相对应。同样也是通过创建一个链接方式的形式来访问远程服务器上的数据。本文简要描述了FEDERATED存…

MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 如:select id f…

@SuppressWarnings使用的正确姿势

SuppressWarnings比较常见,理解和使用起来都很简单。 但是就这这个机会系统的整理一下。 通过源码可以看出,支持在类、属性、方法、参数、构造方法、本地变量上使用。 SuppressWarnings注解的使用有三种: SuppressWarnings(“unchecked”)…

mysql5.7.3安装教程_最新mysql 5.7.23安装配置图文教程

2018年最新MySQL5.7详细安装与配置,总共分为四步,其中环境变量配置不是必须的。1、安装包下载2、安装过程3、环境变量配置4、连接测试一、官网下载MYSQL安装包2.选择合适你电脑系统的版本进行安装。如果有网络,选择在线安装的版本&#xff0c…

MySQL 添加where 1= 1 是否会引起索引失效

背景 在检查数据库的执行效率的时候,发现了一条查询极慢的查询sql。sql的例子如下: EXPLAIN SELECT * FROM user_point_detail_info WHERE 11 AND deleted FALSE AND app_id 2010001 AND point > 10 AND add_time BETWEEN "2021-03-12 17:0…

mysql回档命令_MySQL 备份恢复

1:备份常用工具:mysqldump, xtrabackupmysqldump: 原生数据导出工具,以sql的形式导出保存xtrabackup: percona团队提供的备份工具,基于文件系统的备份2:备份全库:mysqldump -h10.6.29.1 -uroot -p --all-da…

MySQL在like查询中是否使用到索引

mysql在使用like查询中,能不能用到索引?在什么地方使用索引呢? 在使用like的时候,如果使用‘%%’,会不会用到索引呢? EXPLAIN SELECT * FROM user WHERE username LIKE %ptd_%;上面的结果是全表扫描&#…

elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理

一、前言数据平台已迭代三个版本,从头开始遇到很多常见的难题,终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,少走些弯路,在此篇幅中偏重于ES的优化,关于HBase,Hadoop的设…

使用Collections.emptyList()生成的List不支持add方法___Java Collections.emptyList方法的使用及注意事项

使用Collections.emptyList()生成的List不支持add方法 今天使用Collections.emptyList(),返回一个空的List 但是发现它不支持Add功能,调用Add会抛出unsupportedException, 在以后要返回一个空的List,并还需要后续操作时&#xff…

解决SVN代码冲突

解决SVN代码冲突 解决冲突有三种选择: 1、放弃自己的更新,使用svn revert(回滚),然后提交。在这种方式下不需要使用svn resolved(解决) 2、放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行res…

options请求

<1> 一个Option请求引发的深度解析 在当前项目中&#xff0c;前端通过POST方式访问后端的REST接口时&#xff0c;发现两条请求记录&#xff0c;一条请求的Request Method为Options&#xff0c;另一条请求的Reuest Method为Post。想要解决这个疑惑还得从以下3个概念说起…

线程中可以创建进程吗_Linux 进程线程是如何创建的?

上文讲了《Linux进程在内核眼中是什么样子的&#xff1f;》&#xff0c;可以理解内核关于进程线程的所有管理就通过一个结构体 —— task_struct。知道了内核眼中进程的描述&#xff0c;本文通过三个例子站在用户态看下进程线程是如何创建的&#xff0c;不同的创建方式又有哪些…

http请求发生了两次(options请求)

前言 自后台restful接口流行开来&#xff0c;请求了两次的情况&#xff08;options请求&#xff09;越来越普遍。笔者也在实际的项目中遇到过这种情况&#xff0c;做一下整理总结。 文章书写思路&#xff1a; 为什么发生两次请求 http的请求方式&#xff0c;包括OPTIONS、GET…

servlet怎么接受请求_谁再问Servlet的问题,我就亲自上门来教学了

1. 概述在这篇简短的文章中&#xff0c;我们将从概念上理解什么是servlet 和 servlet 容器以及它们是如何工作的。同时&#xff0c;还能在请求、响应、会话对象、共享变量和多线程的上下文中看到它们的身影。2. Servlets 和 它的容器servlet 是 JEE 用于 web 开发常用的组件。它…

Mysql中SQL语句不使用索引的情况

Mysql中SQL语句不使用索引的情况 MySQL查询不使用索引汇总 众所周知&#xff0c;增加索引是提高查询速度的有效途径&#xff0c;但是很多时候&#xff0c;即使增加了索引&#xff0c;查询仍然不使用索引&#xff0c;这种情况严重影响性能&#xff0c;这里就简单总结几条MySQL…

详解mysql什么时候不走索引

全值匹配我最爱&#xff0c;最左前缀要遵守&#xff1b; 带头大哥不能死&#xff0c;中间兄弟不能断&#xff1b; 索引列上不计算&#xff0c;范围之后全失效&#xff1b; LIKE百分写最右&#xff0c;覆盖索引不写 *&#xff1b; 不等空值还有or&#xff0c;索引失效要少用&…

unbuntu cmake安装mysql_ubuntu下编译安装mysql5.5

1.主要步骤如下添加mysql用户和用户组—>下载源码—>解压源码安装编译2个套件—>编译源码-安装编译好的程序-配置mysql启动服务2.Mysql源码解压建好相应的安装目录&#xff0c;将压缩文件复制到安装目录并解压。3.添加用户组Sudo groupadd mysql4.添加用户Sudo userad…

mysql删库后恢复_记一次MySQL删库的数据恢复

昨天因为不可描述的原因&#xff0c;数据库直接被 drop database删除。在第一时间停止数据库服务和Web服务&#xff0c;备份MySQL数据目录下的所有文件之后&#xff0c;开始走上数据恢复之路。第一次干这种事&#xff0c;各种不得法。因为我们既没有备份&#xff0c;也没有开启…

Mysql 中的Text字段的范围

Mysql 中的Text字段的范围 text&#xff1a;存储可变长度的非Unicode数据&#xff0c;最大长度为2^31-1个字符。text列不能有默认值&#xff0c;存储或检索过程中&#xff0c;不存在大小写转换&#xff0c;后面如果指定长度&#xff0c;不会报错误&#xff0c;但是这个长度是不…