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中的变量作用域以及变量提升详细介绍
Oct 24 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
Nov 29 Javascript
Vue动态组件实例解析
Aug 20 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
通过JS运行机制的角度说说作用域
Mar 12 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
Aug 20 Javascript
js+css3实现炫酷时钟
Aug 18 Javascript
JS轮播图的实现方法
Aug 24 Javascript
vue+element UI实现树形表格
Dec 29 Vue.js
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 GUID生成函数和类
2014/03/10 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
jQuery实现增删改查
2020/12/22 jQuery
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Django模板Templates使用方法详解
2019/07/19 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
如何获得EntityManager
2014/02/09 面试题
工业学校毕业生自荐信范文
2014/01/03 职场文书
两只小狮子教学反思
2014/02/05 职场文书
献爱心倡议书
2014/04/14 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
导游词之山西关帝庙
2019/11/01 职场文书