Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:规范化函数中的参数,我应该复制它吗?_Javascript_Functional Programming_Normalization - Fatal编程技术网

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

Javascript:规范化函数中的参数,我应该复制它吗?,javascript,functional-programming,normalization,Javascript,Functional Programming,Normalization,假设有一个函数: const foo = (arg) => { do_something }; 在运行do_something之前,我实际上想将arg规范化为数组,因为函数接受字符串或数组以外的类型 我知道直接修改函数中传递的参数是一种不好的做法,因为它可能会发生变异,并导致难以调试的bug。所以,我会这样做: const foo = (arg) => { const _arg = Array.isArray(arg) ? [...arg] : [arg]; do_some

假设有一个函数:

const foo = (arg) => { do_something };
在运行
do_something
之前,我实际上想将
arg
规范化为数组,因为函数接受字符串或数组以外的类型

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

const foo = (arg) => {
  const _arg = Array.isArray(arg) ? [...arg] : [arg];
  do_something(_arg)
};
如上所述,我实际上对该数组做了一个浅拷贝(
arg
),然后使用
\u arg
做一些事情,我将确保不会对其进行变异(因为它只是一个浅拷贝)。我的问题是如果我不复制它怎么办?i、 e:

const foo = (arg) => {
  const _arg = Array.isArray(arg) ? arg : [arg];
  do_something(_arg)
};
会有所不同吗?或者哪种编码方式更好/更健康?它会影响垃圾收集或任何性能问题吗


谢谢你的回答。

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


这会影响垃圾收集吗?对对于第一种方法,
\u arg
将被清除,因为没有任何内容引用它。我对性能没有把握。这取决于您处理的数据的大小。

我对您的担忧是,在一种默认情况下没有不变性的语言中,我会坚持编码约定,而不是尝试模拟不变性

也就是说,如果您声明不能修改数组,并且如果要推送或替换新元素,则需要使用
Array.prototype.concat
或数组扩展运算符,我相信您的代码将更简单,更易于遵循和维护


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

经验法则:无变异=无需复制。但是,您的
做事
非常有限。它只知道
\u arg
是一些东西的数组
[?]
。因此,它只能执行不需要知道任何元素类型的数组操作,如
切片
concat
等。是的,我现在只想做数组选项,我可以做
\u array.filter(ele=>typeof ele==“function”)
中做些什么
以确保我只拥有一组函数。谢谢你的回答:1。它说我应该做一个深度克隆?!因为浅拷贝不保证任何东西。。。2.只是想澄清一下,如果我没有在函数中返回
\u arg
,那么它就变成了垃圾回收对不对(没有引用的意思)?!抱歉,我还没有完全理解JS垃圾收集…1。是的,至少在给定的情况下是这样。否则,很难回答。有时我们不需要使程序更复杂。2.对JSGC使用“引用计数”和“标记和扫描”算法。你可以在这里读到更多:是的,我相信是的,但有时很难做到。尤其是当我在Node/Express上工作时。我必须变异
res
对象以保持中间件工作。因此,几乎不坚持数组的免疫偏好有时会导致编码困难?!但从你的回答来看,我知道我应该建立一种一致的方式来处理我的代码!我想我会遵循前面评论中提到的经验法则,并尽可能减少代码的复杂性。@LeoLi因此,在一天结束时,您可以将纯FP与可变性混合。我正在与Express中的
Response
object这个问题做斗争,但我习惯了不尝试改变数组、对象。。。既然我们已经有了数组和对象属性扩展操作符,那么遵循规则并生成优雅的代码就更容易了!