为什么用javascript覆盖2D数组的元素

Why overwrite element of 2D array in javascript

本文关键字:数组 元素 2D 覆盖 javascript 为什么      更新时间:2023-09-26

我有一个javascript中的2D数组"allcolor"。因此,我用下面代码中相同的1D数组初始化它的每一行。

var allcolor=[];
var color=["#f73214","#f5f714","#54f714","#141df7","#006400","#556B2F","#2F4F4F",
           "#808080","#8FBC8F","#4B0082","#9400D3","#483D8B","#1E90FF","#00BFFF", 
           "#FFFF00","#ADFF2F","#9932CC","#FF69B4","#FF1493","#8B0000","#8B4513",
           "#B22222","#CD5C5C","#E9967A","#FF8C00","#DAA520","#F0E68C","#FFFAF0",
           "#000000"];
for(p=0;p<x.length;p++){
    allcolor[p]=color;
}

当我更改allcolor每行的每个元素时,覆盖allcolor所有行的其他元素。当我运行下面的代码时,我看到所有[..][0]和所有[..][4]都是相同的值"#000000"answers"#ffffff"。

console.log(allcolor);
allcolor[0][0]='#000000';
console.log(allcolor);
allcolor[0][4]='#ffffff';
console.log(allcolor);

如何更改一行的值?

所以,会发生这种情况,因为javascript变量只存储对对象所属内存位置的引用(有点像C++中的指针)。当你在allcolor数组中放置颜色4次时,它们将引用同一个对象,因此,如果你更改一行的值,你就会更改每行的值。

为了避免这种情况,请进行

allcolor[p]=color.slice();