Skip to content

小小前端

明月本无心,行人自回首。

Menu
  • 前端开发
  • 编程技术
  • SQL语句
  • Linux
  • 生活/旅行
  • JSEditor
  • MiniBarCMS
  • About
  • 隐私政策
Menu

JavaScript中的对象拷贝

Posted on 2017年10月21日2017年10月22日 by king2088

对象拷贝,可能很多人并不是很清楚,而且也使用的不多,简单的说拷贝对象就是直接复制一个数组或者一个对象,听到复制可能大家都蒙了,该如何才能达到复制一个对象或者数组?我们可以将这里的复制理解为是赋值,我们可以将一个数组或者一个对象直接赋值给一个变量,这个过程就可以称为复制(或者对象拷贝),大家一定不要被“复制、拷贝”这样的名词给搞晕了。下面我们来看几个简单的示例

1、JavaScript拷贝数组(浅拷贝)

[cc lang=”javascript”]var arry = [1,2,3]
var arry1 = arry
console.log(arry) //输出[1,2,3],说明拷贝数组成功
arry1[1] = 6
console.log(arry1) //改变arry1拷贝过来数组中的值,输出[1,6,3][/cc]
这就是一个简单的数组拷贝的过程,其意义在于,当我们需要使用和arry相同数据的时候,并且只需要更改其中的一个值,从而达到另一个效果,那么我们就可以使用这一的方式进行数组拷贝。
当然,以上方法主要是属于数组的浅拷贝。

2、JavaScript数组深拷贝

1)、for 循环实现数组的深拷贝

[cc lang=”javascript”]var arr = [1,2,3,4,5,6]
function copyArry(){
let result = [];
for(var i=0;i2)、slice 方法实现数组的深拷贝(将原数组中抽离部分出来形成一个新数组)

[cc lang=”javascript”]var arr = [1,2,3,4,5,6]
var arr2 = arr.slice(0)
console.log(arr2) //[1,2,3,4,5,6]
arr[3] = 9
console.log(arr2) //[1,2,3,4,5,6]
console.log(arr) //[1,2,3,9,5,6][/cc]

3、concat 方法实现数组的深拷贝

这个代码也非常简单,原理更加粗暴。它是用于连接多个数组组成一个新的数组的方法。
[cc lang=”javascript”]var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)//[1, 2, 5, 4, 5]
console.log(arr2)//[1, 2, 3, 4, 5][/cc]

4、对象的深拷贝

1)、for循环实现对象拷贝

[cc lang=”javascript”]var obj = {
name:’李四’,
sex:’男’,
addr:’北京’
}
function copyObj(obj) {
let result = {}
for (var key in obj) {
result[key] = obj[key]
}
return result
}
var obj2 = copyObj(obj)
console.log(obj2)//{name: “李四”, sex: “男”, addr: “北京”}[/cc]

2)、转换成json再转换成对象实现对象的深拷贝

[cc lang=”javascript”]var obj = {
name:’李四’,
sex:’男’,
addr:’北京’
}
var obj2 = JSON.parse(JSON.stringify(obj))[/cc]

5、ES6中的对象拷贝(复制)

1)、使用Object.assign()

ES6中使用Object.assign()深度复制对象,包括其prototype
[cc lang=”javascript”]var Point = function(x)
{
return this.x = x;
}
Point.prototype.y = 2;
var obj = new Point(1);
var copy = Object.assign({ __proto__: obj.__proto__ }, obj); // 输出{x:1} ,__proto__为y:2
console.log(copy) // 输出{x:1},__proto__为y:2[/cc]

2)、ES6展开运算符(Spread Operator)

[cc lang=”javascript”]var obj = {a:1,b:2,c:3}
var obj1 = {obj,d:4,e:5}
console.log(obj1) //{a:1,b:2,c:3,d:4,e:5}[/cc]
但是这种方法如果出现重复的属性名称,就可以利用下面的方法去重
[cc lang=”javascript”]var obj = {a:1,b:2,c:3}
var obj1 = {a:4,b:5,c:6,obj}
console.log(obj1) //{a:1,b:2,c:3}[/cc]
先展开obj
[cc lang=”javascript”]var obj = {a:1,b:2,c:3}
var obj1 = {obj,a:4,b:5,c:6}
console.log(obj1) //{a:4,b:5,c:6}[/cc]
看到了吗?他们有一个先后顺序

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

分类

近期文章

  • cordova-plugin-camera在某些android机型中拍照或选择文件时闪退出错的解决办法 2019年10月24日
  • JavaScript nodeJS base64加密解密url参数 2019年10月15日
  • 利用expressJS编写reset api 2019年4月13日
  • angular4 + http拦截器 2019年3月21日
  • ionic navCtrl.pop如何传递参数给上一个页面 2018年11月16日
  • ionic3搭建开发/测试环境 2018年10月25日
  • ionic2、3双击硬件back按键退出应用 2018年10月24日
  • VMware安装Mac OS High Sierra 10.12及高版本无法全屏 2018年8月24日

近期评论

  • 手表资讯发表在《ReactJS环境搭建》
  • king2088发表在《ionic中使用热更新插件cordova-hot-code-push》
  • 重阳节的诗句发表在《常用的sql语句》
  • 新郎致辞发表在《PHP代码实现WordPress相关文章的几种方法》
  • 霸道总裁发表在《vsftpd 提示 unrecognized service 解决办法》

归档

标签

Ajax Android Angular APP Cordova CSS css3 express html5 ionic Java javascript jQuery Linux loading mac Mac OS mongodb MySQL node nodejs PHP react SQL SSH VirtualBox vue vue-cli win10 WordPress WP REST API 主题 兼容性 前端 备份 插件 数据库 数组 服务器 正则表达式 浏览器 热更新 目录 组件 错误
2023年 3月
一 二 三 四 五 六 日
 12345
6789101112
13141516171819
20212223242526
2728293031  
« 10月    
© 2023 小小前端 | Powered by Superbs Personal Blog theme