gpt4 book ai didi

javascript - 突变什么时候会成为副作用?

转载 作者:行者123 更新时间:2023-11-29 16:31:34 24 4
gpt4 key购买 nike

我遇到了以下How to break on reduce那个没有被标记为功能性的,但是包含了很多关于数组突变是功能性不行的讨论。

main answer改变数组以提前脱离迭代器,但是通过推回拼接项可以轻松地将数组恢复到其原始状态,这是一个有点可疑的解决方案,并且可以说根本不起作用。

然而,如果项目可以就地修改(变异),许多算法会获得显着的优势

对于Javascript(单线程(无工作人员),无代理),如果修改仅暂时存在,是否会被视为突变?或者突变只是函数返回后的副作用。

以下函数是更改器(mutator)吗?

function mutateAndRepair(arr) {  // arr is an array of numbers
arr[0]++;
arr[0]--;
}
  • 数组包含 1 个或多个项目。
  • 数组的第一项(索引 0)是最大安全整数范围内的数字。
  • 该数组不是共享缓冲区
  • 代理未监视该数组

我认为这不是突变,因为突变仅在函数执行时存在,并且由于 JS 阻塞,其他代码将无法看到突变,因此没有副作用。

考虑到这些限制,这是否符合 JavaScript 编码人员使用的常见功能范例?

最佳答案

++--运算符正在发生变化,并且它们并不完全相反。引用 2017 standard :

12.4.4.1Runtime Semantics: Evaluation
UpdateExpression : LeftHandSideExpression ++

  1. Let lhs be the result of evaluating LeftHandSideExpression.
  2. Let oldValue be ? ToNumber(? GetValue(lhs)).
  3. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.8.5).
  4. Perform ? PutValue(lhs, newValue).
  5. Return oldValue.

第二步很重要,因为它将值转换为 number原始,但它和 Number 之间也有细微的区别。 Number 返回的对象构造函数。

var arr = [new Number(1234)];

function mutateAndRepair(arr) {
console.log(`the value before is ${arr[0]}`);
arr[0]++;
arr[0]--;
console.log(`the value after is ${arr[0]}`);
}

arr[0].foo = 'bar';
console.log(`foo before is ${arr[0].foo}`);
mutateAndRepair(arr)
console.log(`foo after is ${arr[0].foo}`);

现在,我在这里有点厚颜无耻地解释了您的要求,即 arr 的第一项是一个“数字”。当然,您可以添加另一个规定,即 arr 的值必须是“数字基元”以排除这种确切形式的突变。

另一个更微妙的点怎么样? -00除了 Object.is 之外,几乎在所有方面都被视为相同的值:

var arr = [-0];

function mutateAndRepair(arr) {
console.log(`the value before is ${arr[0]}`);
arr[0]++;
arr[0]--;
console.log(`the value after is ${arr[0]}`);
}

console.log(`is zero before ${Object.is(0, arr[0])}`);
mutateAndRepair(arr)
console.log(`is zero after ${Object.is(0, arr[0])}`);

好的,您可以添加一个要求,即arr的第一项不是-0 。但所有这些都没有捕获重点。如果您简单地声明您将忽略任何观察到突变的情况,您可能会争辩说几乎任何方法都是非突变的。

Considering the restraints does this comply with the common functional paradigm used by JavaScript coders?

不会认为此代码遵循功能编码原则,如果这是项目的目标,我什至可能会在代码审查中拒绝它。它甚至不是关于所有代码路径如何或是否保证不变性的本质,而是它依赖于内部突变这一事实,在我看来,这使得该代码不起作用。我发现伪功能代码中出现了许多错误,其中 mutate 之间发生异常。和repair步骤,这当然会导致明显且意想不到的副作用,即使您有 catch/finally阻止尝试恢复状态,那里也可能发生异常。这也许只是我的观点,但我认为不变性是更大的功能风格的一部分,而不仅仅是给定函数的技术特征。

关于javascript - 突变什么时候会成为副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55798417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com