全局变量被修改

如图为函数中的一段代码,countData为全局变量,结构大概如下

countData:{[message:[
              {time: "2018-08-03"},
              {time: "2018-08-03"}
                    ]
           ],
           [photo:[
              {time: "2018-08-03"},
              {time: "2018-08-07"},
              {time: "2018-08-07"},
              {time: "2018-08-07"}
           ]
           ]}

clipboard.png
clipboard.png

第一张图代码执行后,得到的处理后的listData,而全局变量countData不等于起始的countData
第二张图代码执行后,得到的处理后的listData,全局变量countData还是原来的值,这个是理想的结果。

已经把全局变量赋给了新的变量,并没有直接修改全局变量,为什么第一张图的代码会对全局变量有影响?

阅读 3.3k
2 个回答

“已经把全局变量赋给了新的变量”,那个全局变量指向的是一个对象,是个地址引用。 当你把countData赋值给listData后,他们两个指向同一个地址,故只要listData有改动,countData也一定变化。

你应该先要了解哪些是 私有的 哪些是共有的(持有相同引用的)
图一.

var obj = {name:[1,2]};
var newObj = {};
newObj.name = obj.name;

以上: name属性这个为newObj私有 但是name的值 [1,2]obj和newObj 共有

//1. 改变name不会影响
newObj.name = [1,3];
console.log(obj)//[1,2]
console.log(newObj)//[1,3]
//2. 但改变name值会影响
newObj.name[1] = 3;
console.log(obj)//[1,3]
console.log(newObj)//[1,3]

图二.

var obj = {name:[1,2]};
var newObj = obj;

以上:对象之间赋值 newObj里面所有的东西都是和obj共有
不管如何改都会互相影响

//1. 
newObj.name = [1,3];
console.log(obj)//[1,2]
console.log(newObj)//[1,3]
//2. 
newObj.name[1] = 3;
console.log(obj)//[1,3]
console.log(newObj)//[1,3]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题