Javascript 为什么此数组在未被要求更改其值的情况下更改其值?

Javascript 为什么此数组在未被要求更改其值的情况下更改其值?,javascript,arrays,Javascript,Arrays,我用这样的方式声明了这个数组 : var gamme = [ ["A"], ["A♯","B♭"], ["B","C♭"], ["C","B♯"], ["C♯","D♭"], ["D"], ["D♯","E♭"], ["E","F♭"], ["F","E♯"], ["F♯","G♭"], ["G"], ["G♯","A♭"], ]; 使用这个数组,我将生成另一个数组。 我想让气质像这样 : 例如 :

我用这样的方式声明了这个数组 :

var gamme =
[
    ["A"],
    ["A♯","B♭"],
    ["B","C♭"],
    ["C","B♯"],
    ["C♯","D♭"],
    ["D"],
    ["D♯","E♭"],
    ["E","F♭"],
    ["F","E♯"],
    ["F♯","G♭"],
    ["G"],
    ["G♯","A♭"],
];
使用这个数组,我将生成另一个数组。 我想让气质像这样 : 例如 :

temperamentEgal[10] = [103.82617439498631, ["G♯","A♭"]]
temperamentEgal[25] = [233.08188075904502, ["A♯","B♭"]]
这就是我要做的 :

base = pow(2,1/12); // 2^(1/12)
for (i=0; i<12*octaves; i++) // octaves = 6
{
    temperamentEgal[i] = []
    temperamentEgal[i][0] = 55*pow(base,i); // = 138.6
    temperamentEgal[i][1] = gamme[i%12]; // = ["C♯","D♭"]
    console.log("gamme["+i%12+"] = " + gamme[i%12]);
    for (j=0; j<temperamentEgal[i][1].length; j++)
    {
        var octaveNote = 1+i/12;
        octaveNote = floor(octaveNote);
        temperamentEgal[i][1][j] +=  str(octaveNote);
    }
}
如果我注释掉
tempermentegal[I][1][j]+=str(octaveNote)它不再发生了


为什么更改
tempermentegal[i][1]
的值也会更改
gamme[i%12]
的值?

在不更改
gamme
的情况下,您会更改此行引用的匿名数组:

temperamentEgal[i][1] = gamme[i%12];
现在,此赋值的右侧和左侧都指向相同的数组对象-如果要修改数组的副本,应复制数组的值,而不是对数组对象的引用:

ES5:
templamentegal[i][1]=gamme[i%12].slice()

ES6:
tempermentegal[i][1]=[…gamme[i%12]]
使用

temperamentEgal[i][1] = gamme[i%12];