javascript一切都是值传递,只不过传递的值是一个引用。
可能有点绕口,来看例子慢慢解释一下。(例子来自

function changeStuff(a, b, c) {
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

所以打印出来的是:

10
changed
unchanged

来进行几个假设:
1. 如果js中全是值传递:那么obj1不应该更改为changed。
2. 如果js中全是引用传递:那么num就应该变为100而不是10。
3. 如果js中基础类型是值传递,对象是引用传递:在这个假设中obj2是进行的引用传递,那么我们更改了obj2的引用指向,但是在打印的时候却发现它还是原值。
4. 如果是本文开头的那样,js中全部是值传递,只不过传递的值是一个引用:num是一个引用,指向了当初内存中的10,但是这个引用是以值传递的,所以修改这个值传递的参数的指向,是无法修改原引用的指向,而obj1的引用也是用值传递的,但是使用引用值访问的成员却是真正的引用,所以能更改成功。

关于这种特殊的值传递,wiki上有一个定义,叫做分享传递(call-by-share)。
希望能够让看到文章的人理解。

分类: 前端

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注