我试图理解我对 JavaScript 对象的困惑。具体来说,我有兴趣找出导致对象引用中断的原因(如果有的话)。
为了演示这种现象,我提供了 Chrome 的 JavaScript 控制台的一些输出的副本。请注意,我在这里使用数组,但考虑到 JS 中数组和对象之间的细微区别,我们希望对象的行为相似。为了清楚起见,我添加了评论。
// Set x to some array literal
> x = [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
// Set y to x
> y = x
[1, 2, 3, 4, 5]
> x
[1, 2, 3, 4, 5] // as expected
> y
[1, 2, 3, 4, 5] // as expected
如上所示,两者都x
输出y
期望值。现在我使用一个名为shuffle
(在这个问题的底部指定)的函数来洗牌 x 的值。
// Shuffle x
> x = shuffle(x)
[5, 1, 4, 2, 3]
> x
[5, 1, 4, 2, 3] // x changes as expected
> y
[5, 1, 4, 2, 3] // y changes as expected
同样,一切都按上述预期工作。变量x
并y
保持对同一对象的引用。然而,当我们重复这个操作时,结果却很奇怪。
// Shuffle x
> x = shuffle(x)
[3, 1, 5, 4, 2]
> x
[3, 1, 5, 4, 2] // x changes as expected
> y
[5, 1, 4, 2, 3] // y didn't change this time
下面是 shuffle 函数,改编自这里。它的目的是打乱数组(参数r1
)的内容并返回n
混合数组的第一项。
function shuffle(r1,n) {
var i = r1.length, j, tempi, tempj, r2;
r2 = r1;
while (--i) {
j = Math.floor(Math.random() * (i + 1));
tempi = r2[i];
tempj = r2[j];
r2[i] = tempj;
r2[j] = tempi;
}
return r2.slice(0,n);
}
我已经通过基于这个函数重写我的 shuffle 函数解决了这个问题。但是,我仍然想了解发生了什么。为了快速查看实际代码,我制作了一个jsFiddle。
有任何想法吗?我很感激你的时间。