防止在javascript中修改对象和数组

防止在javascript中修改对象和数组,javascript,parameter-passing,pass-by-reference,Javascript,Parameter Passing,Pass By Reference,正如您所知,在javascript中,对象和数组是通过引用发送的,如果我们得到如下内容: const obj=[{room:5},{room:35},{room:25},{room:15}]; static test(obj) { for (let i=0;i<obj.length;i++) { obj[i].room++; } return obj; } return {ok:true,D:obj,R:this.test(obj)};

正如您所知,在javascript中,对象和数组是通过引用发送的,如果我们得到如下内容:

const obj=[{room:5},{room:35},{room:25},{room:15}];

static test(obj)
  {
    for (let i=0;i<obj.length;i++)
    {
      obj[i].room++;
    }
    return obj;
  }
return {ok:true,D:obj,R:this.test(obj)};
const obj=[{room:5},{room:35},{room:25},{room:15}];
静态试验(obj)
{

对于(设i=0;i),可以使用对象或数组的副本:

对象

const copy = JSON.parse(JSON.stringify(obj))
阵列

const copy = array.slice(0)

对象冻结(obj[0])
…对象总是通过引用传递的,如果您想防止这种情况发生,请使用另一种语言。
如您所知,在javascript中,对象和数组是通过引用发送的。
。不,它们不是。javascript中的所有内容都是通过值传递的。有关详细信息,请参阅。@scott我认为,如果再次讨论这种情况,这对任何人都没有帮助。事实是:objects的传递方式与原语不同,称之为“通过引用”这很合适IMO@JonasWilms对象的传递方式没有任何不同,这就是问题所在。通过引用调用它是错误的。变量中存储的内容对于对象和原语来说是不同的。因此,为了帮助抑制这种经常重复出现的错误语句,我加入了。但是,这就是为什么我将其作为注释发布的原因,因为这是c注释用于注释。无论对象是否通过引用传递(从技术上讲,它不是),为了避免问题,您可以冻结对象,或者使用
JSON.parse(JSON.stringify(object))对其进行深度复制;
。没有其他解决方案,因为对于任何对象,传递对象的内存位置都是自己的。为了理解,预期的行为是什么?如果将对象传递给函数,则通常是改变对象的预期行为。