Q : 参数 到底是 按值传递 还是 按引用传递 ?
A : 按值传递
例子 :
// 这里用一个经典的 引用类型传递到函数参数中 , 来佐证是按值传递的
function setName(object){
object.name = 'name changed'; // ①添加name属性
object = new Object(); // ②将object指向新的对象
object.name = 'name not changed'; // ③为新的对象添加name属性
}
let person = new Object();
setName(person);
console.log(person.name);//display 'name changed'
分析 :
步骤①起到效果了
步骤②中,object指向了新的对象,即 引用的值/地址 改变了
但是 person并没有指向新的对象(这个新的对象在函数退出时 就销毁了)
如果是按引用传递,则person应该指向第②步中的新对象,即使后来它销毁了,person也没有理由重新指向原来的对象
然而结果是 person就是指向了原来的对象,并且name的值已经设置成功, 说明 函数在接收参数的时候, 是按值传递的(值就是复制了的引用)
总结一句话 :
变量的访问 分为 按值访问 以及 按引用访问 ;
参数的传递 只有 按值传递.
以上是书中的例子 , 但是我感觉并不能佐证 参数按值传递的
以下代码是传说中的 引用类型在访问时 是 按引用访问 .
但是效果 和 上面的函数传参 进行类比 , 反而可以得出 参数是按引用传递的.
var person = new Object() ;
person.id = 1 ;
var object = person ; //这一步相当于传递到形参中 , object就是形参
object.id = 2 ;
object = new Object();
object.id = 3 ;
console.log(person.id); //display 2
// 当我 对此感到 疑虑的时候 , 在网上搜索了一下 , 还有说 既不是按值传递 , 也不是按引用传递的. 有人提出了 按共享传递.
// 结果在 这个页面上 看到了一个作者 写的反例代码 以及结论 和我不谋而合 , 哈哈,写书的大神的结论是错误的 O(∩_∩)O~
=================================