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 相关文章推荐
jquery ajax例子返回值详解
Sep 11 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
Dec 23 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
Apr 17 Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 Javascript
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
tagName的使用,留一笔
2006/06/26 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
python基于Selenium的web自动化框架
2019/07/14 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Pycharm中如何关掉python console
2020/10/27 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
什么是唯一索引
2015/07/05 面试题
高级电工工作职责
2013/11/21 职场文书
关于赌博的检讨书
2014/01/08 职场文书
保健品市场营销方案
2014/03/31 职场文书
小学二年级学生评语
2014/04/21 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
运动会新闻报道稿
2015/07/22 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
Python find()、rfind()方法及作用
2022/12/24 Python