You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript函数修改全局数组参数 如何避免rotr改动原数组

问题原因

JavaScript中,数组属于引用类型,函数传入数组参数时,实际传递的是指向原数组的内存引用,不是数组的独立副本。你写的rotr函数里调用的pop()、unshift()都是直接修改原数组的变更方法,第一次执行rotr(w[sh1],7)时就直接改动了w[sh1]存储的原始数组,后续两次函数调用传入的都是已经被修改过的数组,自然得不到基于原始值计算的结果。

这点和Python的列表传参逻辑完全一致:如果你在Python函数里直接对传入的list调用pop()、insert()这类原地修改方法,一样会改动外部的原始列表,之前没遇到类似问题大概率是写Python时习惯先传x[:]切片生成副本再操作,写JS时漏了这一步。

修复方案

修改rotr函数逻辑,进入函数后首先创建原数组的副本,所有旋转操作都在副本上执行,完全不触碰传入的原始数组。

const s0 = XORXOR(rotr(w[sh1], 7), rotr(w[sh1], 18), shr(w[sh1], 3))

function rotr(x, n) {
    // 生成原数组的独立副本
    const res = [...x];
    for(let c = 0; c < n; c++) {
        res.unshift(res.pop());
    }
    return res;
}

额外注意事项:

  • 所有纯工具类函数都尽量遵循「不修改入参」的原则,避免产生难以排查的隐式副作用
  • 上述代码用的展开运算符属于浅拷贝,仅能保证数组第一层元素的独立性;如果数组元素是对象、其他数组这类引用类型,需要根据实际需求实现深拷贝才能完全隔离对原数据的修改
  • 如果你实现的是密码学算法里的按位右旋(而非数组元素整体旋转),当前的数组操作逻辑本身也不符合位运算的rotr定义,需要额外调整实现,但这不属于本次问题的排查范围

内容的提问来源于stack exchange,提问作者Makouru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:15:37