关于js按值传递和按共享传递的一个题目

今天看到一个有关按值传递和按共享传递的题目:

function foo(a) {
  a = a * 10;
}
function bar(b) {
  b.value = 'new';
}
var a = 1;
var b = {value: 'old'};
foo(a);
bar(b);
console.log(a); // 1
console.log(b); // {value: 'new'}

我们可以发现,有foo(a)或没有foo(a)没啥区别。

但bar(b)显然是起到作用了,它改变了b的值。

这是因为,Number类型的a是按值传递的,而Object类型的b是按共享传递的。

JS为什么要这么设计呢?为什么要分按值传递和按共享传递?

按值传递的类型,复制一份存入栈内存中,这类类型一般不占用太多内存,而且按值传递保证了其访问速度。

按共享传递的类型,是复制其引用,而不是复制整个值。

栈内存

如果整个复制其值的话,万一对象过大,这么搞会造成内存的浪费。