先明确一下结论:函数的参数传递,传递的都是值,参数是 Object 类型的也一样,也是值,只不过这个值是地址值。( C 语言中, 函数参数的传递情况也是这样!很多教材都讲解的有问题的!)

    下面是作者的原话:

    variables are accessed both by value and by reference, but arguments are passed only by value.

    啰嗦了这么多就是想让你知道,JS 中函数传递只有按值传递,没有按引用传递,C 语言里也一样!

    下面来讲解一下:

    1. function setName(obj) {
    2. // 这里 obj 和 person 指向内存中的同一块地址,a 地址
    3. obj.name = "Nicholas";
    4. // 这里 obj 指向了新对象所在的地址( b 地址),切断了和 a 地址的联系
    5. obj = new Object();
    6. obj.name = "Greg";
    7. }
    8. var person = new Object();
    9. setName(person);
    10. alert(person.name); //output: "Nicholas"

    我们把 person 的地址值传递给 obj 之后,obj 和 person 都指向了堆内存中的 同一块地址( a 地址 ),所以这里对 obj 进行添加或删除属性的操作,都是在 a 地址上操作的,所以相应的变化会反映在 person 对象上。

    那么,当对 obj 重新赋值, 这时候就切断了 obj 和 a 地址之间的联系,所以对 obj 上的任何操作也不会反映到 person 对象上。如果函数的参数是按引用传递的话, person 也会指向地址 b , 然而事实上 person 指向的是地址 a 。

    现在,抛弃你脑海中参数传递还有按引用传递的情况, 只有按值传递!

    出处:https://www.zhihu.com/question/51018162/answer/123779633