Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript函数参数按引用存储_Javascript - Fatal编程技术网

JavaScript函数参数按引用存储

JavaScript函数参数按引用存储,javascript,Javascript,我不确定这是否是回答我问题的正确方式。如果我设置以下JavaScript代码: var x = 5; var y = function(z) { z=7; return z; } y(x); x; 我从函数调用返回7,但x保持其原始值。我认为JavaScript变量是通过引用调用的,所以为什么x的值实际上没有通过函数更改?多亏了@TeddHopp关于这个注释: 仅为所有变量传递值,而不仅仅是原语。你 无法通过将调用代码中的变量传递给 作用(当然,您可以更改可能需要的对象或数组。

我不确定这是否是回答我问题的正确方式。如果我设置以下JavaScript代码:

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:)