【问题标题】:Array Assignment in Functional Programming JS [closed]函数式编程 JS 中的数组赋值
【发布时间】: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 功能不同。一个改变全局变量,另一个不改变。你使用什么取决于你需要什么。

标签: javascript arrays function functional-programming


【解决方案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")

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多