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 提供的不可变集合。
假设有一个函数:
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 提供的不可变集合。