基本类型和引用类型

类型种类访问类型存储类型
基本类型按值访问栈内存
引用类型按引用访问堆内存

函数参数是'按值传递'的

此处的按值传递和上面提到的按值访问是两个不一样的概念, 此处指的是给函数传入参数后, 我们操作的是复制参数后的值

①.当传入参数为基本类型时:

const count = 0

function add(num) {
  num = ++num
  return num
}

const result = add(count)

console.log(count)  // 0 可以看到传入参数仍然是 0
console.log(result) // 1

当 count 作为参数传入函数 add 时, 在栈内存中就会复制一份 count 的值, 我们操作的其实是复制后的这个值。可用下图表示:

②.当传入参数为引用类型时:

const reference = { num: 0 }

function add(obj) {
  obj.num = 1
  obj = new Object() // ① 此处函数参数的引用发生改变
  obj.num = 2
  return obj
}

const result = add(reference)

console.log(reference) // { num: 1 }
console.log(result)    // { num: 2 }

类似的, reference 作为参数传入函数 add 时, 栈内存中会多出一个指向堆内存的值(类似 hash 值)。可用下图表示:

当执行 obj = new Object() 实际上是更改了 hash2 的指向(hash1 的指向并没有发生变化), 所以更改函数参数的引用是不会影响到原参数的。