复制和引用复制

在编程语言中,赋值和参数传递可以通过value-copy(值复制)或者reference-copy(引用复制)来完成,这取决于使用的是什么语法。

C语言中有指针这个概念,如果要向函数传递一个数并在函数中更改它的值,可以通过‘&’传递变量,这就是reference-copy;若是没有声明为引用的话,就是通过value-copy的方式传递。

但在JavaScript中没有指针这个概念,但也有这两种复制,不过,在语法上没有区别,并且引用指向的是值。这两种复制完全根据值的类型来决定。


// 第一种
let a = 2;
let b = a; // b是a的值一个副本,也就是value-copy
b++;
a; //2
b; //3
// 第二种
let c = [1, 2, 3];
let d = c;  // d是[1, 2, 3]的一个引用,引用指向的是值哦,这是reference-copy
d.push(4);
c; // [1, 2, 3, 4]
d; // [1, 2, 3, 4]

由上可知,基本类型的值是通过值复制的方式来赋值或是传递的,基本类型有null、undefined、字符串、数字、布尔以及ES6中的symbol。
引用类型的值是通过引用复制的方式来赋值或是传递的,引用类型有数组、对象、函数等。
由于引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向。也就是说,多个引用相互之间没有引用/指向关系。关于这点,看代码就清楚了,如下:

let c = [1, 2, 3];
let d = c;  // 这时d和c都为[1, 2, 3]

d = [4, 5, 6];
c; // [1, 2, 3]
d; // [4, 5, 6]
// d = [4, 5, 6];这句赋值语句并不会影响c指向值[1, 2, 3],除非b是指向c的,但上面我们已经说过‘引用指向的是值本身而非变量’!!!
// 要知道直接赋值和push()是不一样的,前者是重新引用,而后者是在引用的基础上往里面加东西。
// 若是想要在引用的基础上清空数组,可以用arr.length = 0的方式

特别要注意的一点是,那些基本类型,在初始化时,可以封装成对象,可就算如此操作,还是更改不了‘它是基本类型值’的事实,所以还是value-copy,代码如下:

function add(x) {
    x += 1;
}
let a = new Number(1); // typeof a => object
add(a); 
a;  // a为2,而不是3  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值