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

标签 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♭"],
];

使用这个数组,我正在生成另一个数组。 我希望 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/

相关文章:

java - 为什么泛型数组的声明是正确的?

javascript - 如何将数据从 express 传递到我的 hbs View

java - 除了第一个索引上的计数外,输出的值都是正确的

java - objectarray 中对象字段的总和,全部在构造函数内?

javascript - JQuery DatePicker 多输入

Python numpy 数组与列表

arrays - 如何对带有选项的数组执行indexOf?

javascript - shopify点击不同的按钮将运行不同的液体代码

javascript - 创建自定义指令并使用 UI-bootstrap 时出现错误 'Multiple Directive Resource Contention'

javascript - 如果我需要数 9,007,199,254,740,993 怎么办?