Javascript 突变什么时候会变成副作用?

Javascript 突变什么时候会变成副作用?,javascript,functional-programming,Javascript,Functional Programming,我遇到了以下没有标记为功能性的,但是包含了很多关于数组变异是功能性的否的讨论 修改后的数组很早就脱离了迭代器,但是可以通过推回拼接项轻松地将数组恢复到其原始状态,这是一个有点可疑的解决方案,可以说根本不起作用 然而,如果项目可以就地修改(变异),许多算法会获得显著优势 关于JavaScript(单线程(无工),无代理),如果修改仅临时存在,那么它被认为是突变吗?或者变异只是函数返回后的副作用 下面的函数是一个变量吗 function mutateAndRepair(arr) { // arr

我遇到了以下没有标记为功能性的,但是包含了很多关于数组变异是功能性的否的讨论

修改后的数组很早就脱离了迭代器,但是可以通过推回拼接项轻松地将数组恢复到其原始状态,这是一个有点可疑的解决方案,可以说根本不起作用

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

关于JavaScript(单线程(无工),无代理),如果修改仅临时存在,那么它被认为是突变吗?或者变异只是函数返回后的副作用

下面的函数是一个变量吗

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

我认为这不是突变,因为突变只存在于函数执行时,并且Js是阻塞的,没有其他代码能够看到突变,因此没有副作用。


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

+
运算符正在变异,并且它们之间并不完全相反。引述:

12.4.4.1运行时语义:评估 UpdateExpressionLeftHandSideExpression++

  • lhs
    作为计算
    LeftHandSideExpression
    的结果
  • oldValue
    成为
    ?ToNumber(?GetValue(lhs))
  • newValue
    作为将值
    1
    添加到
    oldValue
    的结果,使用与+运算符相同的规则(见12.8.5)
  • 执行
    ?PutValue(lhs,newValue)
  • 返回
    oldValue
  • 第二步很重要,因为它将值转换为
    number
    原语,但这与
    number
    构造函数返回的
    number
    对象之间也有细微的区别

    var-arr=[新编号(1234)];
    功能突变数据对(arr){
    log(`前面的值是${arr[0]}`);
    arr[0]++;
    arr[0]-;
    log(`后面的值是${arr[0]}`);
    }
    arr[0].foo='bar';
    log(`foo before是${arr[0].foo}`);
    突变修复(arr)
    
    log(`foo after是${arr[0].foo}`)我认为您可能过于依赖单词定义和技术细节。如果在方法内部隔离状态更改,并且没有其他代码可以看到这些状态更改,那么这不是副作用。这就是方法封装的全部要点。好问题。想象一下
    arr
    有getter/setter。甚至是一个代理人。实际上,每一个访问者都可能是不纯的。是的,我看到了你的限制,但它们适用于现实世界的代码吗?“考虑到这些限制是否符合通用的功能范式?”我不认为这个代码是“功能性的”,即使您添加了足够的先决条件,以确保在实践中它没有可观察到的副作用。除非您保留原始状态的副本以供比较,否则不会检测到状态的任何修改。但是状态还是改变了。如果你想要暂时的易变性,使用一个临时变量。不要改变你的论点。如果你自己清理干净,然后建立任意规则说它是不可见的,这仍然是一个副作用。在函数式语言中,我给出的例子是不可能的。JS和functional的耦合很差,只有一个堆,一个调用堆栈,仅仅调用一个函数可能会有副作用,这条线在哪里画?您确实强调,即使小心,也很难涵盖所有可能性,我完全没有想到,
    -0
    。。顺便说一句,还有
    const a=newfloat64array([-0]),b=newuint8array(a.buffer);a[0]++;a[0]-
    b[7]
    从128更改为0@Blindman67的确JavaScript提供了许多实现函数式风格的机制,但在强制方面(即使使用eslint)的机制相对较少。可悲的是,这意味着JavaScript开发人员通常必须比Haskel或F#开发人员更加意识到反功能陷阱。