美文网首页JAVASCRIPT编入集
十二、必须说的传递关系

十二、必须说的传递关系

作者: loster | 来源:发表于2018-01-21 13:31 被阅读49次

    在学习cpp( C++ )时候,有一堂课专门讲了关于值、引用、地址传递的关系,不过毕竟转行没有继续写cpp,所以只能当作课本上的知识来说一下了。

    传值:也叫副本传递。其实就是从定义对象的本身clone了一个副本。如果你知道火影的影分身之术,就明白了,从本体上拷贝一份出来,然后再去对分身操作。这时候和本体是没有关系的。

    传引用:这个就比较操蛋了,生活中经常遇到的某个隔壁老王,其实就是一个引用,代指那个生理越界的人。或者你天天叫的大佬,也是一个引用。这个引用就比较多了,五花八门的。cpp上用 &表示这是一个变量的引用。或者说狗子你变了,这里的狗子也是一个引用,代表的就是你啊。

    指针 或者叫地址,其实就是某一块内存的编号。cpp用 *表示这个变量是一个地址引用。虽说写的是代码,但是毕竟所有的代码内容都是跟内存打交道,不管是间接还是直接。这个指针就是直接跟内存打交道的了。怎么形容这个指针呢,经纪人你们都知道吧。

    比如说这里

    int a = 1;
    

    划了块地(开辟了一块内存)创立个公司(地址),公司主体内容是(主体内容) 1,这时候有个a掌管了这个公司。
    a其实就是法人代表,法人就是那块内存,1 就是公司经营能力,而int就是公司经营范围。
    然后有一个内容:

    int &b = a;
    

    这时候对法人代表取了个名字,叫b。
    然后这时候:

    int *c = &a;
    

    雇了一个经纪人,经纪人拿到了实际上的法人授权书。
    如果这样还不懂的话呢,我就不知道怎么解释清楚关系了。
    当然,我们JavaScript不需要了解那么多引用、地址关系。但是我们还是需要知道值的传递关系。
    JavaScript使用的是按值传递

    var a = 1;
    var b = a;
    b = 2;
    a // 1
    b // 2
    

    其实如果你看很多代码工具的编译后,这句话会被直接替换为

    var a = 1;
    var b = 2;
    

    不过刨去这些不说,按照一步一步赋值操作来说,传递之后的内容并不会影响到之前的内容。
    基本类型的确是这样的。不过,对于引用类型的来说,就有待区分了,同样是按值传递,引用类型传递的是一份引用副本。类似一把钥匙,拿去复制了一把。两个钥匙都能开一把锁。比如:

    var a = {};
    var b = a;
    b.name =1;
    a // {name:1}
    b// {name:1}
    

    这下懂了吧,其实这里的b类似于指针关系,明确拿到了a操作 {} 的那块地址。这也就是引用类型。
    不得不说一下最强指针:this
    this其实就是当前顶级作用域(或者说上下文对象)的指针。上下文是由系统控制的,不能赋值。所以对this是不能赋值的。

    相关文章

      网友评论

        本文标题:十二、必须说的传递关系

        本文链接:https://www.haomeiwen.com/subject/nbmfaxtx.html