这里讲的是引用类型作为函数参数传递的例子。
function setName(obj) { obj.name = 'aaa'; var obj = new Object();//如果是按引用传递的,此处传参进来obj应该被重新引用新的内存单元 obj.name = 'ccc'; return obj;}var person = new Object();person.name = 'bbb';var newPerson = setName(person);console.log(person.name + ' | ' + newPerson.name); // aaa | ccc复制代码
1.根据引用类型复制变量复制的是指针,按高级教程指南原书说法叫做reference
2.引用类型作为参数进入函数,按原书说法就是将引用类型复制给函数的argument,然后作者就开始给了两个例子来说明引用类型作为参数是value传递而不是reference传递(ps.中英版都研读一般以后我还是蒙逼)
3.引用类型复制是reference,即复制的是内存区域的指针,可以理解形参obj首先由argument[0]赋值,即obj = argument[0]。当person进到函数的过程第一步就是argument[0] = person,即person的指针给了argument[0]。(其实可以理解为利用第三个变量argument保存引用)
4.当obj.name ='aaa';由于argument[0]指针是person,而obj = argument[0],所以obj也就是指向person。所以person.name=‘aaa’
5.obj = new Object();创建一个新对象并他的指针复制给变量obj,此时obj的指针不再指向person了。而person的指针是不会受到影响的,所以最终person.name ='aaa'
6.高级教程指南原书前文也提过基本类型值变量的复制是重新分配内存空间,引用类型变量由于无法直接访问堆内存中的对象所以它实际的值是内存地址即指针,通过指针来操作js对象,引用类型的复制就是复制指针,所以这两种变量在内存中的存储方式根本不一样嘛,值传递和引用传递不就是为了区分这两种不同的存储方式吗,那么怎么在函数传参(实际不就是给将变量值复制给argument)又能同一了呢,逻辑上就说不通啊
7.综上所述我的理解是引用类型在函数传参上还是reference传递