javascript函数传参是传值还是传引用?

function changeStuff(num, obj1, obj2)
{
    num = num * 10;
    obj1.item = "changed";
    obj2 = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);   // 10
console.log(obj1.item);    // changed
console.log(obj2.item);    // unchanged

为什么是这个情况?

阅读 5.4k
8 个回答

js所有的传递都是值传递

JavaScript中所有参数的传递均是值传递

  • 第一个输出: 这个函数对变量num唯一的操作,就是将他的赋给了num参数.你的函数只是对参数操作,而没有对变量操作.如果是引用传递,那么num的值应该为100.然而并没有

  • 第二个输出: obj1.item = "changed";更改了obj1的item属性.而obj2 = {item: "changed"}又对参数赋值了另一个新创建的对象,所以你的函数并没有对obj2对象进行任何操作.之所以是这样的原因,正好说明了参数的值传递.
    详细原因见<JavaScript高级程序设计>

js高程上面有详细讲,js函数都是按值传递参数的。

旧答案错了。刚看了下js高程,里面说的很清楚是传值得额。。

js中的所有参数传递都是传值,但是这个传值你要理解的一点是:基本数据类型的传值是指的复制值,引用类型传值指的是地址传递,为什么会传递地址呢?因为保存在栈中的变量保存的是地址,所以它传递的肯定是地址。

基本类型是传值,引用类型是传址

无耻的贴一篇自己的文章,是根据《js高程》自己总结的,看2.传递参数

终于搞明白了,是call by shareing.就是分享,共享,共享值,共享地址,一切都豁然开朗了

推荐问题
宣传栏