gpt4 book ai didi

javascript - 为什么这个数组会在没有被要求的情况下改变它的值?

转载 作者:行者123 更新时间:2023-11-30 15:31:37 26 4
gpt4 key购买 nike

我有这样声明的数组:

var gamme =
[
["A"],
["A♯","B♭"],
["B","C♭"],
["C","B♯"],
["C♯","D♭"],
["D"],
["D♯","E♭"],
["E","F♭"],
["F","E♯"],
["F♯","G♭"],
["G"],
["G♯","A♭"],
];

使用这个数组,我正在生成另一个数组。我希望 temperamentEgal 看起来像这样:例如:

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);
}
}

如您所见,我在任何时候都不会更改 gamme 的值尽管如此,随着循环的进行,我从 console.log 中得到了这个:

gamme[0] = A
gamme[1] = A♯,B♭
gamme[2] = B,C♭
gamme[3] = C,B♯
gamme[4] = C♯,D♭
gamme[5] = D
gamme[6] = D♯,E♭
gamme[7] = E,F♭
gamme[8] = F,E♯
gamme[9] = F♯,G♭
gamme[10] = G
gamme[11] = G♯,A♭
gamme[0] = A1
gamme[1] = A♯1,B♭1
gamme[2] = B1,C♭1
gamme[3] = C1,B♯1
gamme[4] = C♯1,D♭1
gamme[5] = D1
gamme[6] = D♯1,E♭1
gamme[7] = E1,F♭1
gamme[8] = F1,E♯1
gamme[9] = F♯1,G♭1
gamme[10] = G1
gamme[11] = G♯1,A♭1

如果我注释掉 temperamentEgal[i][1][j] += str(octaveNote); 它就不会再发生了。

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

最佳答案

当您不更改 gamme 时,您更改了此行引用的匿名数组:

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

此赋值的右侧和左侧现在都指向相同的 Array 对象 - 如果您想修改 Array 的副本,您应该复制 Array 的值,而不是对 Array 对象的引用:

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

ES6:temperamentEgal[i][1] = [...gamme[i%12]] 使用 spread operator

关于javascript - 为什么这个数组会在没有被要求的情况下改变它的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com