Javascript: 规范化函数中的参数,我应该复制它吗?

Javascript: normalize argument in a function, should I copy it?

假设有一个函数:

const foo = (arg) => { do_something };

在我 运行 do_something 之前,我实际上想将 arg 规范化为数组,因为该函数接受字符串或数组以外的类型。

我知道在函数中直接修改传递的参数是一种不好的做法,因为它可能会发生变异并导致难以调试的错误。所以,我会做这样的事情:

const foo = (arg) => {
  const _arg = Array.isArray(arg) ? [...arg] : [arg];
  do_something(_arg)
};

如上所述,我实际上对该数组进行了浅拷贝(arg),然后使用_arg做一些事情,我会确保不改变它(因为它只是一个浅拷贝)。我的问题是如果我不复制它怎么办?即:

const foo = (arg) => {
  const _arg = Array.isArray(arg) ? arg : [arg];
  do_something(_arg)
};

会有不同吗?或者哪一种是 better/healthier 编码方式?它会影响垃圾收集或任何性能问题吗?

感谢您的回答。

IMO,推荐第一种方法,因为如果 do_something 引起一些副作用,第二种方法通常会导致意想不到的问题。

会影响垃圾回收吗?是的。使用第一种方法,_arg 将被清理,因为没有任何引用它。我不确定性能。这取决于您处理的数据大小。

我对你的担忧的两分钱是,在默认情况下没有不变性的语言中,我会坚持编码约定而不是试图模仿不变性。

也就是说,如果您声明不得修改数组,并且如果一个新元素应该 推送 或替换,您需要使用 Array.prototype.concat数组展开运算符,相信你的代码会更简单,更容易理解和维护。

此外,您可能希望使用 ImmutableJS 提供的不可变集合。