JavaScript复制变量三种方法实例详解


Posted in Javascript onJanuary 09, 2020

这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

直接将一个变量赋给另一个变量时,系统并不会创造一个新的变量,而是将原变量的地址赋给了新变量名。举个栗子:
复制代码
复制代码
let obj = {
a: 1,
b: 2,
};
let copy = obj;

obj.a = 5;
console.log(copy.a);
// Result
// a = 5; // 更改obj的值,copy变量的值也会改变
复制代码
复制代码
文章中提到了很多种办法,本文只选择了三种普遍的用法并分析了各自的优缺点,以及什么情况下使用哪种是最好的。

1. 原生方法解决
最简单的办法就是一个一个循环复制给新的变量。举栗:

复制代码
复制代码
function copy(mainObj) {
let objCopy = {}; // objCopy will store a copy of the mainObj
let key;

for (key in mainObj) {
objCopy[key] = mainObj[key]; // copies each property to the objCopy object
}
return objCopy;
}

const mainObj = {
a: 2,
b: 5,
c: {
x: 7,
y: 4,
},
}

console.log(copy(mainObj));
复制代码
复制代码
缺点:

1. objCopy 的Object.prototype 方法与mainObj 会不一样,通常情况下我们需要完全一样的副本时,这个办法并不适用。

2. 麻烦而且费时费事,代码无法重用。

3. 如果原来的变量中包含Object类型,复制时还是会把这个子变量的索引交给新的变量,并不是创建了新的副本。

2. 深度复制
利用JSON转换来复制变量。先将原先的变量转换为String然后再重新组装成JSON,这样会产生一个不一样的副本。

复制代码
复制代码
let obj = {
a: 1,
b: {
c: 2,
},
}

let newObj = JSON.parse(JSON.stringify(obj));

obj.b.c = 20;
console.log(obj); // { a: 1, b: { c: 20 } }
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object Intact!)
复制代码
复制代码
缺点:

1. 变量很多的时候非常耗时耗内存。

3. 使用Object.assign()
使用举例:

复制代码
复制代码
// circular object
let obj = {
a: 'a',
b: {
c: 'c',
d: 'd',
},
}

obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;

let newObj2 = Object.assign({}, obj);

console.log(newObj2);
复制代码
复制代码
可以把它封装成一个方法:

复制代码
// 封装成方法
// 返回一个新的变量副本
// get a copy of an object
function getNewObjectOf(src) {
return Object.assign({}, src);
}
复制代码
缺点:

1. 这个也是浅复制(仅复制顶层的属性,底层属性并不复制)。深层属性会同样返回索引,与原变量分享一个地址。(看下面栗子)

复制代码
复制代码
let obj = {
a: 1,
b: {
c: 2,
},
}
let newObj = Object.assign({}, obj);
console.log(newObj); // { a: 1, b: { c: 2} }

obj.a = 10;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 1, b: { c: 2} }

newObj.a = 20;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 20, b: { c: 2} }

newObj.b.c = 30;
console.log(obj); // { a: 10, b: { c: 30} }
console.log(newObj); // { a: 20, b: { c: 30} }

// 注意: 所有变量 的 *。b.c 都等于30; 原因看上面解释。
复制代码
复制代码

结论:
原文中还有很多其他的办法,但此文仅摘抄出最有用的几个。一般不会用到第一种办法,如需要复制的变量有很多层的话,需要用第二种办法来复制,如果变量仅仅包含一层(如json格式的配置信息变量),第三种是最高效的。

再次给出封装好的方法:

// 封装成方法// 返回一个新的变量副本
// get a copy of an object
function getNewObjectOf(src) {
 return Object.assign({}, src);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一些相见恨晚的 JavaScript 技巧
Apr 25 Javascript
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
offsetHeight在OnLoad中获取为0的现象
Jul 22 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
基于jQuery的checkbox全选问题分析
Nov 18 Javascript
利用原生JS与jQuery实现数字线性变化的动画
Feb 24 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 Javascript
小程序组件之自定义顶部导航实例
Jun 12 Javascript
js实现左右轮播图
Jan 09 #Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 #Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 #Javascript
Websocket 向指定用户发消息的方法
Jan 09 #Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 #Javascript
JS实现商品橱窗特效
Jan 09 #Javascript
微信小程序实现页面浮动导航
Jan 08 #Javascript
You might like
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python 加密与解密小结
2018/12/06 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
python实现UDP协议下的文件传输
2020/03/20 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
学院书画协会部门职责
2013/11/28 职场文书
设计顾问服务计划书
2014/05/04 职场文书
庆祝教师节主持词
2015/07/06 职场文书
七年级英语教学反思
2016/02/15 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
golang定时器
2022/04/14 Golang