在学习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是不能赋值的。