【发布时间】:2018-09-25 19:50:18
【问题描述】:
假设有一个函数:
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)
};
会有所不同吗?或者哪一种是更好/更健康的编码方式?它会影响垃圾收集或任何性能问题吗?
感谢您的回答。
【问题讨论】:
-
经验法则:无突变 = 无需复制。但是,您的
do_something非常有限。它只知道_arg是[?]的数组。因此它只能执行不需要知道任何元素类型的数组操作,例如slice、concat等。 -
是的,我现在只想做数组选项,我可能会在
do_something中做_array.filter(ele => typeof ele === ‘function’),以确保我只有一个函数集合。
标签: javascript functional-programming normalization