对象的浅拷贝

2018-01-04  本文已影响0人  默成S
var obj = {
  count: 1
}

function output(obj) {
  obj.count = obj.count + 1;
  console.log(obj.count);
}

在上面代码之后,执行下面代码分别输出什么?

output(obj);
console.log(obj.count);

1、假如两个值不一样,为什么?
2、假如两个值一样,为什么?有没有办法保证output函数内的obj.cout的改变不影响外面的obj.count?


执行的结果是一样的,因为在使用对象作为函数参数时,实际上传送给函数的是对象的地址,即函数体内的对象和作为参数的原对象实际上是同一个。所以,想要不影响外面的obj,就需要在函数体内定义一个局部的obj对象,并复制外部obj的值。
本例可实现如下

var obj = {
count: 1
}

function output(obj) {
var obj = JSON.parse(JSON.stringify(obj));
obj.count = obj.count + 1;
console.log(obj.count);
}

反思:
对象赋值并不是复制,而是引用、映射。output函数的形参对象变量其实就是实参变量的引用,所有他们是同一个。
在output函数内为了不影响真正的obj实体,有两种方式。

function output(obj) {
  obj = Object.assign({}, obj);
  obj.count = obj.count + 1;
  console.log(obj.count);
}

function output(obj) {
  obj = JSON.parse(JSON.stringify(obj));
  obj.count = obj.count + 1;
  console.log(obj.count);
}

以上两种方式都是对形参obj对象重新“复制”一份新的对象.

js中的浅拷贝和深拷贝:https://segmentfault.com/a/1190000008637489

上一篇下一篇

猜你喜欢

热点阅读