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
网友评论