首页 >web前端 >js教程 >按值传递与按引用传递,重要吗?

按值传递与按引用传递,重要吗?

Susan Sarandon
Susan Sarandon原创
2025-01-20 18:51:08427浏览

值传递与引用传递:深入探讨

在第一次技术面试中,我被问到了这个问题:值传递与引用传递有什么区别?我的回答是:值传递传递的是值,引用传递传递的是引用。虽然这个答案很基本,甚至有些肤浅,但并非完全错误,只是需要进一步解释。

值传递: 变量的值被复制一份,并作为参数传递给函数。函数执行各种操作使用的是这个复制的值,原始变量的值保持不变。几乎所有已知的编程语言(包括JavaScript和Java)都使用值传递。

Pass By Value vs. Pass By Reference, Does It Matter?

引用传递: 引用是指指向内存中值的变量,可以把它想象成指针。它作为参数传递给函数,并使用参数为其赋予别名(别名引用)。函数执行各种操作使用的是这个参数,该参数可以访问值的内存位置。因此,任何使用该参数的操作都会影响原始变量的值,原始变量的值会发生改变。只有少数编程语言使用引用传递,例如C 具备这种能力,但即使在C 中,默认模式也是值传递。

Pass By Value vs. Pass By Reference, Does It Matter?

值传递示例:

以下示例使用JavaScript,它严格遵循值传递,无论是原始类型还是引用类型(对象)都适用。这是一个经典的交换函数示例:

<code class="language-javascript">const firstPrimitive = 1; //传递给firstArgument的原始值
const secondPrimitive = 2; //传递给secondArgument的原始值

const firstObject = {name: "first", reason: "Test pass-by-value"}; //传递给firstArgument的对象
const secondObject = {name: "second", reason: "Test pass-by-value"}; //传递给secondArgument的对象

function swap(firstArgument, secondArgument){
    const placeholder = secondArgument;
    secondArgument = firstArgument;
    firstArgument = placeholder;

    console.log('当前位于函数内部。');
    console.log('firstArgument = ', firstArgument, ', secondArgument = ', secondArgument, '\n');
}

console.log('函数执行前。');
console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive);
console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');

swap(firstPrimitive, secondPrimitive);
console.log('当前位于函数外部。');
console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive, '\n');

swap(firstObject, secondObject)
console.log('当前位于函数外部。');
console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');</code>

执行这段代码后,结果如下:

<code>函数执行前。
firstPrimitive =  1 , secondPrimitive = 2
firstObject =  { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }

当前位于函数内部。
firstArgument =  2 , secondArgument =  1

当前位于函数外部。
firstPrimitive =  1 , secondPrimitive = 2

当前位于函数内部。
firstArgument =  { name: 'second', reason: 'Test pass-by-value' } , secondArgument =  { name: 'first', reason: 'Test pass-by-value' }

当前位于函数外部。
firstObject =  { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }</code>

请注意,在swap函数内部,两个值被交换了;然而,在函数外部,值保持不变。

引用传递示例:

以下示例使用C ,可以通过引用传递来实现。可以使用地址运算符(&)来实现。同样,它也使用了swap函数的一个版本:

<code class="language-c++">#include <stdio.h>

void swap(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swap(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}</code>

输出结果是:

<code>A is 20 and B is 10</code>

这里a和b的值发生了改变,因为它们被用作引用。

总结: 引用传递意味着函数接收变量的内存地址(通过引用),允许它直接修改原始变量;而值传递意味着变量值的副本被传递,不会修改原始变量。

这重要吗?

绝大多数编程语言都使用值传递,我们似乎别无选择。那么,这该如何应用呢?我的发现如下:

  • 当你只是“使用”参数进行一些计算,而不需要为客户端程序更改它时,使用值传递。
  • 当你需要函数修改作为参数传递的变量的原始值时,使用引用传递,因为它直接操作变量的内存位置,而不是创建副本,这使得它更高效,尤其是在处理大型数据结构(如复杂对象或数组)时;它避免了复制数据的开销,并允许在函数内部直接更改原始变量。引用传递可以提高性能。

欢迎评论。谢谢。

参考资料: JavaScript是按引用传递吗? 引用传递 (仅限C )

以上是按值传递与按引用传递,重要吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn