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

标签 javascript functional-programming normalization

假设有一个函数:

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)
};

会有所不同吗?或者哪一种是更好/更健康的编码方式?它会影响垃圾收集或任何性能问题吗?

感谢您的回答。

最佳答案

IMO,建议使用第一种方法,因为如果 do_something 引起一些副作用,第二种方法通常会导致意外问题。

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

关于Javascript:标准化函数中的参数,我应该复制它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49851100/

相关文章:

javascript - AngularJS - 动态生成的 ng-model-name

javascript - 如何在 Rails 中突出显示搜索到的单词?

javascript - 使用带有 $routeProvider 的 Promise 来创建解析变量

sql - 如果 X 确定 Y 那么 Y 可以是一个集合吗?

c++ - 规范化变量名 C/C++

TypeScript:尝试使用字符串时,索引签名参数必须是 'string' 或 'number' |数字

javascript - React – 将事件从子组件传递到父组件

haskell - 在 Haskell 中实现 liftM2

javascript - 如何像在 JavaScript 中一样在 Stream.map() 中应用 Direct 函数

haskell - 为什么 liftM 不破坏上下文?