Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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_Argument Passing - Fatal编程技术网

函数式JavaScript:避免参数变异的良好实践?

函数式JavaScript:避免参数变异的良好实践?,javascript,functional-programming,argument-passing,Javascript,Functional Programming,Argument Passing,这是一个相当普遍的问题。函数式编程促进了这样一种理念,即程序是通过函数来转换数据的,应该避免变异(函数内部可能除外,因为它被视为基本的抽象单元) 但在这个节目中: function foo (bar) { bar.k1 = "bananas"; return bar; } var o = { k1: "apples", k2: "oranges"}; var p = foo(o); 外部变量o在foo中发生了变异,因为bar是对o的引用,并且最终,o===p(它们引用相同的对象)。但

这是一个相当普遍的问题。函数式编程促进了这样一种理念,即程序是通过函数来转换数据的,应该避免变异(函数内部可能除外,因为它被视为基本的抽象单元)

但在这个节目中:

function foo (bar) {
  bar.k1 = "bananas";
  return bar;
}

var o = { k1: "apples", k2: "oranges"};
var p = foo(o);
外部变量o在foo中发生了变异,因为bar是对o的引用,并且最终,
o===p
(它们引用相同的对象)。但功能范式更希望p是新数据

显而易见的解决方案是克隆参数(例如,使用下划线/lodash的
\uu.clone
):


但我想知道这是否是思考这个问题的正确方式。在FP透视图中,如果将对象作为变量进行克隆,您认为这是一个很好的做法吗?(我知道,并非所有对象都可以轻松克隆,如果有的话,但让我们坚持简单的情况)。您的想法?

理想情况下,每次调用函数时,它都应该返回一个全新的对象。显然,出于性能原因,它不是很好,这就是它存在的原因。JS有几个库;可以说是最受欢迎的

否则,对对象进行变异是可以的,在JS中这是一种常见的做法,因为不是每个项目都能立即从持久数据结构中获益,再加上库的重量


还请注意,在JavaScript中,所有内容都是通过值传递的,但值本身可以包含引用。

我的2分钱是用来编写与该语言一起工作的代码,而不是挂在编程技术上。函数式编程很不错,但是如果你不需要一个新的对象,就没有理由返回一个,只要你能改变原来的对象。如果我想做一些类似的事情,我需要返回这个对象:
someOtherFunction(foo(o))
。你可能的意思是,这是一个新对象还是对外部对象的引用并不重要,重要与否取决于你自己?您是否需要原始对象保持不变,如果没有理由创建新对象,只需在修改后将传递给函数的对象返回即可。我认为在非函数式编程中,变异参数甚至被轻视,并且始终需要正确记录/传达
function foo (_bar) {
  var bar = _.clone(_bar);
  bar.k1 = "bananas";
  return bar;
}