函数式编程 JS 中的数组赋值

Posted

技术标签:

【中文标题】函数式编程 JS 中的数组赋值【英文标题】:Array Assignment in Functional Programming JS [closed] 【发布时间】:2021-10-25 13:06:55 【问题描述】:

当在函数内部声明一个新的局部变量并将其分配给一个与数组相等的全局变量时,什么更好?

选项 1:使用展开运算符:

let globalArray = [1, 2, 4];

function add (arr, value) 

  let newArray = [...arr];

  newArray.push(value);
  return newArray;
  


console.log(add(globalArray, "red"));

选项 2:不使用扩展运算符:

let globalArray = [1, 2, 4];

function add (arr, value) 

  let newArray = arr;

  newArray.push(value);
  return newArray;
  


console.log(add(globalArray, "red"));

我看不出输出的差异。是否应该使用扩展运算符?

【问题讨论】:

第二个将改变全局数组,从而产生可观察的效果。因此,它是不纯的。 FP 力求纯度以控制副作用 旁注:... 不是,也不能是操作员。操作员不能做... 所做的事情。 Copy array by value的可能重复 没有“更好”。您的 2 个代码 sn-ps 功能不同。一个改变全局变量,另一个不改变。你使用什么取决于你需要什么。 【参考方案1】:

没有标准就没有“更好”,尽管我们可以在这里推断出一些标准。 :-)

使用push 而不复制(您的“NOT”选项)变异传递给您的函数(全局)的原始数组,这在函数式编程中通常不会完成。 FP 倾向于使用不可变数据结构和纯函数(松散地说:没有副作用的函数)。

如果您不想改变全局数组,请使用 spread 或 concat 或类似的。例如,使用扩展语法(后面不需要push,我们可以在数组字面量中包含value):

let newArray = [...arr, value];

let globalArray = [1, 2, 4];

function add (arr, value) 
    const newArray = [...arr, value];
    return newArray;


const updated = add(globalArray, "red");
console.log(updated);
console.log(updated === globalArray); // false
console.log(globalArray); // unchanged
.as-console-wrapper 
    max-height: 100% !important;

如果你想改变全局数组,在传入的数组上使用push

let globalArray = [1, 2, 4];

function add (arr, value) 
    let newArray = arr;
    newArray.push(value);
    return newArray;


const updated = add(globalArray, "red");
console.log(updated);
console.log(updated === globalArray); // true!
console.log(globalArray); // changed!
.as-console-wrapper 
    max-height: 100% !important;

...但同样,这通常不会在 FP 中完成。据我了解(我对 FP 没有深入了解),即使您想更新 globalArray,通常也可以通过重新分配来实现:globalArray = add(globalArray, "red")

【讨论】:

以上是关于函数式编程 JS 中的数组赋值的主要内容,如果未能解决你的问题,请参考以下文章

《JS权威指南学习总结--8.8 函数式编程和8.8.1使用函数处理数组》

为啥不应该在函数式编程中使用变量赋值

用一个数组来体验函数式编程

数组方法和函数式编程

函数式编程

Scala函数式编程彻底精通