博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS中把对象赋值给变量时出现的问题
阅读量:7124 次
发布时间:2019-06-28

本文共 941 字,大约阅读时间需要 3 分钟。

问题

刚才碰到了一个这样的问题:有一个由对象组成的数组,把其中一个对象赋值给变量p,然后改变了p的属性,对应的原来数组中的对象的属性也会随之改变。

var arr = [{x:0, y:0}, {x:0, y:0}]var p = arr[0]p.x = 1p.y = 2console.log(arr) // [{x:1, y:2}, {x:0, y:0}]

探究

我一开始以为这是数组的什么神奇特性,经过几番试验发现只有由对象组成的数组有这个问题,隐隐觉得这是对象的某个特性,然后又试了下,果然如此!

var a = {x:0, y:0}var p = ap.x = 1console.log(a) // {x:1, y:0}

a赋值给变量p之后,改变p的某个属性,a中对应的属性也会随之改变。

原因

简单地想了一下原因,不知道正确不正确:

var p = a是让p指向了a所代表的对象。同理,var a = {x:0, y:0}是让a指向了{x:0, y:0}这样一个对象。所以实际上pa指向的是同一个对象,修改其它们中任何一个都会使另一个一同改变。

解决办法

那有没有让p改变之后a保持不变的办法呢?

有的!

var a = {x:0, y:0}var p = {}p.x = a.xp.y = a.y

通过这种方式把a的属性一一对应地赋值给p,之后对p做出的任何修改都不会影响到a。但是这种方法很麻烦,特别是碰到属性很多的对象,那么可以写个函数来完成这个工作:

function cloneObj(obj) {  var newObj = {}  for(var prop in obj) {    newObj[prop] = obj[prop]  }  return newObj}
var a = {x:0}var p = cloneObj(a)p.x = 2console.log(p) // {x:2}console.log(a) // {x:0}

成功了!修改p的属性之后a的属性没有随之改变。


后来网上查了查,发现js中有深拷贝和浅拷贝这样的区分,粗粗看了一遍。但是没有更多的实际使用经验所以理解也不是很深刻,如果以后有了更深的见解的话到时候再来写一篇。

转载地址:http://cteel.baihongyu.com/

你可能感兴趣的文章
Linux文件管理
查看>>
JFinal常见问题汇总
查看>>
Ubuntu install vsftpd
查看>>
【BuglyIOS干货分享】iOS内存管理:从MRC到ARC实践
查看>>
【Bugly干货分享】Android性能优化典范之多线程篇
查看>>
【腾讯Bugly干货分享】QQ电话适配iOS10 Callkit框架
查看>>
python,时间加减,时间计算,时间格式化,时间提取汇总
查看>>
Python 数据结构>>7.7 列表解析
查看>>
基于MapReduce框架的PageRank算法实战(下)
查看>>
linux 管理工具
查看>>
页面被刷新两次异常
查看>>
java小知识点
查看>>
Linux 配置ip,远程,验证,运行,救援,相关
查看>>
Java(Android)线程池
查看>>
Spring MVC整合Velocity
查看>>
使用 GUID 值来作为数据库行标识讲解
查看>>
find命令详解
查看>>
linux字符终端中文显示输入工具zhcon
查看>>
PLANT:
查看>>
lambda的堆“数”特性
查看>>