覆盖函数参数值是一个好的实践吗?

6

在JavaScript中,我试图添加一个新值并返回它。

以下是有关覆盖参数值的示例:

该函数接收一个字符串值作为参数,并用新值覆盖该参数并将其返回。

function test(value) {
  value = value + "hi";
  return value;
}
console.log(test("Hello"));

下面的函数接收一个字符串值作为参数。我想要添加一个新值并返回它。所以我将值分配给一个局部变量,然后将其附加到一个新变量中,并返回它。

function test(value) {
  let temp = value;
  temp = value + "hi";
  return temp;
}
console.log(test("Hello"));

我将其调用并传递值。
  test(“Hello”);

以上哪一个是推荐的?

没有问题 - Jaromanda X
或者 value += "hi"; - Mister Jojo
5个回答

4

这只是一种风格问题。有些人认为你应该保持参数值不变,而有些人则认为更改参数值没有问题。¹

从实际角度来看,这不会造成任何伤害。也就是说,这样做没有任何隐藏的副作用。特别是,由于JavaScript是纯粹的按值传递,重新分配参数对填充该参数的任何参数都没有影响:

function test(value) {
    value = value + "hi";
    return value;
}

let a = "let's say ";
let b = test(a);
console.log(b);       // "let's say hi"
console.log(a === b); // false, `a` was not modified

您可以使用 temp 来简化您的版本:
function test(value) {
    let temp = value + "hi";
    return temp;
}

(甚至

function test(value) {
    return value + "hi";
}

(注:我认为这个问题被大大地简化了。)
¹(我碰巧是持有后一种观点的人,但这不重要。)

1
简短回答是:这只是风格问题。
然而,这并不总是正确的。当传递对象时,它们将被引用传递,这意味着您对参数所做的每个更改都会影响原始对象。

const obj = {originalValue: true};

function modifyObject(input) {
  input.originalValue = false; // The change happens here
  return input;                // So it will take place regardless of this line
}

console.log('before:', obj);
modifyObject(obj);             // See? we don't even retrieve the return value
console.log('after:', obj);


对象本身与问题无关。修改对象的状态与重新分配参数完全不同。 - T.J. Crowder
它仍然引入了一种不同的(有些人会说“奇怪”的)行为,与OP在一般情况下询问函数参数时所描述的不同。 - GalAbra
2
我会和@GalAbra一起处理这个问题。在我刚开始编程的时候,我也注意到了一些不一致性。 - Gaurav Mall

1

是的,这完全没有问题,在许多语言中,许多程序员经常这样做。这是一种常见的做法。

您可以在想要在函数内部使用参数值但在对其进行某些修改后使用它的情况下使用它。

例如,我可能想要使用函数 add(a, b) 来添加两个数字,其中 ab 可以是 字符串整数浮点数

但仅仅为了确保,我可以按以下方式定义 add 函数:

function add(a,b) {
 a = parseFloat(a);
 b = parseFloat(b);
 return a + b;
}

这是完全没问题的。这样我就可以始终确信不会抛出任何异常,或者在传递参数为字符串的情况下,它不会返回12(如果我说add(1,2)),而实际上应该是3
通过将参数覆盖变成常规做法并将其纳入您的编码风格中,您可以使浏览器免于创建或定义新变量以修改这些变量值。这在小型应用程序中可能意义不大,但在大规模重型应用程序中,尤其是在低端设备上,可能会有明显的差异。

0

使用ES6模板字符串

function test(value){
return `${value} hi`;
}

-1

如果我们谈论的是Java,那么创建一个新变量是一个好的做法。因为有一个叫做垃圾回收器的东西会收集未使用的变量等,并且将它们丢弃。所以保持对原始变量的链接不会让回收器丢弃该变量。(我在某个地方读到过这个,但有些人告诉我它并不真的按照这种方式工作,所以如果你想了解更多,请在网上阅读)

然而,在JavaScript中,这并不重要。这取决于你。你的风格。这也取决于情况,有时可能会有用。但实际上并不重要。随你喜欢。

如果你想简化它,你可以像@T.JCrowder说的那样做:

 function test(value){
   return value+ “hi”;
 } 

就是这样了。


你的开头段落是错误的。在Java中重新分配参数与在JavaScript中的操作完全相同,垃圾收集器的工作不会受到任何影响。 - T.J. Crowder
我也这么认为,不过我记得在某个地方看到过。我的意思是,在一本Java编程书中看到过不覆盖变量可以提高速度的说法。但我不确定。 - Gaurav Mall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接