资讯专栏INFORMATION COLUMN

复制和引用复制

mmy123456 / 1777人阅读

摘要:在编程语言中,赋值和参数传递可以通过值复制或者引用复制来完成,这取决于使用的是什么语法。但在中没有指针这个概念,但也有这两种复制,不过,在语法上没有区别,并且引用指向的是值。

在编程语言中,赋值和参数传递可以通过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  

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101359.html

相关文章

  • 详解js深浅复制

    摘要:从而也引出了所谓的深浅复制问题。附注对于浅复制,其实还有其他的实现方式,比如数组中和方法,对于这些还是希望大家自己了解,本本主要针对深浅复制的实现原理进行解析。 前言 在之前写继承的过程谈到了深浅复制的问题,因为有读者反映到需要解析,趁今天周末写一篇解析,今天的主体相对之前来说理解难度低一些,篇幅可能也比较短,诸君按需阅读即可。 从两种数据类型说起 在js中,变量的类型可以大致分成两种...

    Lin_YT 评论0 收藏0
  • JS的深浅拷贝

    摘要:引用类型之所以会出现深浅拷贝的问题,实质上是由于对基本类型和引用类型的处理不同。另外方法可以视为数组对象的浅拷贝。上面描述过的复杂问题依然存在,可以说是最简陋但是日常工作够用的深拷贝方式。 一直想梳理下工作中经常会用到的深拷贝的内容,然而遍览了许多的文章,却发现对深拷贝并没有一个通用的完美实现方式。因为对深拷贝的定义不同,实现时的edge case过多,在深拷贝的时候会出现循环引用等问...

    xiaoxiaozi 评论0 收藏0
  • Python中的对象引用、可变性垃圾回收

    摘要:一对象引用基础知识变量是标注而不是容器。也就是说元组中不可变的是元素的标识,但元组的值会随着引用的可变对象变化而变化。在中每个对象的引用都会有统计。弱引用不会妨碍对象被当做垃圾回收。 导语:本文章记录了本人在学习Python基础之面向对象篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、明确变量保存的是引用这一本质;2、熟悉对象引用的基础知识;...

    ytwman 评论0 收藏0
  • PHP 引用是个坑,请慎用

    摘要:发布时最大的变动是对象处理方式。这很容易被误解为引用,但是存储器的引用与引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且还会使性能下降这个事实外,使用引用这种方式会使得代码难以维护。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我参加了很多次会议,其中八次会议里我进行了相关发言,...

    dockerclub 评论0 收藏0
  • 详解js深浅复制问题

    摘要:二这么分的好处就是在于节省内存资源,便于合理回收内存详解中的深浅复制有了上面的铺垫,那么我们理解起深浅复制就变得容易的许多。 前言 对于前端开发来说,我们经常能够遇到的问题就是js的深浅复制问题,通常情况下我们解决这个问题的方法就是用JSON.parse(JSON.Stringify(xx))转换或者用类似于Inmmutable这种第三方库来进行深复制,但是我们还是要弄懂其中原理,这样...

    X1nFLY 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<