JavaScript函数参数按引用存储
我不确定这是否是回答我问题的正确方式。如果我设置以下JavaScript代码:JavaScript函数参数按引用存储,javascript,Javascript,我不确定这是否是回答我问题的正确方式。如果我设置以下JavaScript代码: var x = 5; var y = function(z) { z=7; return z; } y(x); x; 我从函数调用返回7,但x保持其原始值。我认为JavaScript变量是通过引用调用的,所以为什么x的值实际上没有通过函数更改?多亏了@TeddHopp关于这个注释: 仅为所有变量传递值,而不仅仅是原语。你 无法通过将调用代码中的变量传递给 作用(当然,您可以更改可能需要的对象或数组。
var x = 5;
var y = function(z) {
z=7;
return z;
}
y(x);
x;
我从函数调用返回
7
,但x
保持其原始值。我认为JavaScript变量是通过引用调用的,所以为什么x
的值实际上没有通过函数更改?多亏了@TeddHopp关于这个注释:
仅为所有变量传递值,而不仅仅是原语。你 无法通过将调用代码中的变量传递给 作用(当然,您可以更改可能需要的对象或数组。) 已传递;但是,变量本身在调用中保持不变 代码。) 如果希望以任何方式更改
x
的值,可以执行以下操作:
x = y(x);
感谢@TeddHopp关于此说明:
仅为所有变量传递值,而不仅仅是原语。你 无法通过将调用代码中的变量传递给 作用(当然,您可以更改可能需要的对象或数组。) 已传递;但是,变量本身在调用中保持不变 代码。) 如果希望以任何方式更改
x
的值,可以执行以下操作:
x = y(x);
这里真正的问题是你没有变异任何东西;您只是在函数中重新分配变量
z
。如果您传递了一个对象或数组,这不会有什么区别
var x = ['test'];
var y = function(z) {
z=['foo'];
return z;
}
y(x);
x; // Still ['test']
现在,其他人所说的也是事实原语不能变异。这实际上比听起来更有趣,因为以下代码可以工作:
> var x = 1;
> x.foo = 'bar';
"bar"
> x
1
> x.foo
undefined
请注意,分配给
x.foo
的任务似乎是成功的,但却找不到x.foo
。这是因为JavaScript很容易强制基本类型和对象类型(有基本类型的“对象”版本,即普通对象)。在这种情况下,原语1
被强制为一个新对象(newnumber(1)
),该对象的foo
属性被设置,然后它被迅速销毁,因此不会产生持久的效果。这里真正的问题是,你没有变异任何东西;您只是在函数中重新分配变量z
。如果您传递了一个对象或数组,这不会有什么区别
var x = ['test'];
var y = function(z) {
z=['foo'];
return z;
}
y(x);
x; // Still ['test']
现在,其他人所说的也是事实原语不能变异。这实际上比听起来更有趣,因为以下代码可以工作:
> var x = 1;
> x.foo = 'bar';
"bar"
> x
1
> x.foo
undefined
请注意,分配给
x.foo
的任务似乎是成功的,但却找不到x.foo
。这是因为JavaScript很容易强制基本类型和对象类型(有基本类型的“对象”版本,即普通对象)。在这种情况下,原语1
被强制为一个新对象(newnumber(1)
),该对象的foo
属性被设置,然后它被立即销毁,因此不会产生持久的效果。原语按值传递。原语按值传递。哦,好的。因此,当我在函数中重新分配z
时,z
和x
不指向同一数组/对象?我想这就是所谓的引用。你能帮我理解我没有得到什么吗?再次感谢你的回答@user2066880-在函数内部重新分配z
之前,它们是相同的对象。在此之前,您可以使用z
修改对象,这些修改将在调用代码中看到。如果您替换了z=['foo']代码>在该代码中使用z[0]=“foo”
,则调用代码中的x
将更改为['foo']
。哦,好的。因此,当我在函数中重新分配z
时,z
和x
不指向同一数组/对象?我想这就是所谓的引用。你能帮我理解我没有得到什么吗?再次感谢你的回答@user2066880-在函数内部重新分配z
之前,它们是相同的对象。在此之前,您可以使用z
修改对象,这些修改将在调用代码中看到。如果您替换了z=['foo']代码>在该代码中使用z[0]=“foo”
,则调用代码中的x
将更改为['foo']
。只为所有变量传递值,而不仅仅是原语。不能通过将变量传递给函数来更改调用代码中的变量。(当然,您可以更改可能传递的对象或数组;但是,变量本身在调用代码中保持不变。)谢谢。你每天都会学到新东西。我想我更习惯Java:)所有变量都只传递值,而不仅仅是原语。不能通过将变量传递给函数来更改调用代码中的变量。(当然,您可以更改可能传递的对象或数组;但是,变量本身在调用代码中保持不变。)谢谢。你每天都会学到新东西。我想我更习惯Java:)