文章内三个情况的个人理解

    首先是实参是原始类型

    1. var value = 1;
    2. function foo(v) {
    3. // 这里应该是将value赋值给v 这个时候v等于1
    4. v = 2;
    5. console.log(v); //2
    6. }
    7. foo(value);
    8. console.log(value) // 1

    相当于将 value 拷贝给 v 此时 value 和 v 分别在两个不同的内存空间,这时候不管是修改v还是value都是修改各自内存空间的值,互不影响

    然后实参是引用类型

    1. var obj = {
    2. value: 1
    3. };
    4. function foo(o) {
    5. o.value = 2;
    6. console.log(o.value); //2
    7. }
    8. foo(obj);
    9. console.log(obj.value) // 2

    这里的实参是obj对象,当实参obj对象给foo函数的形参o赋值的时候是将obj对象的在堆内存的指向拷贝给o,这时相当于obj和o都是指向对象 {value:1}。所以在修改o的时候其实也会影响到obj,因为它们指向的都是一个对象

    原文是这么说的 按共享传递是传递对象的引用的副本

    第三种 实参是对象的一个值,其实也是相当于原始类型

    1. var obj = {
    2. value: 1
    3. };
    4. function foo(o) {
    5. o = 2;
    6. console.log(o); //2
    7. }
    8. foo(obj);
    9. console.log(obj.value) // 1

    这里obj.value(值为1)作为实参拷贝给形参因为拷贝的是原始类型的值,就直接开辟了一个新的内存空间值为1并赋值给o。这个时候修改o的值为2,也只是修改新开辟的内存空间的值由1改为2,并不会影响到obj.value的值