Javascript 随机播放未按预期运行

Javascript shuffle is not working as its supposed to

这是我正在使用的随机播放功能:

function shuffle(o,l){
      for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;

}

我在这段代码中使用它来打乱一个变量,但不知何故它打乱了两个变量?

 function generate() {
    if (a = 1) {
    var shuffled = $.data;
     shuffle(shuffled,500);
    } else if (a = 2) {
 for (var i = 0; i < 500; i++) {
        console.log($.data[i]);
     }}
 }

它会打乱 'shuffled' 变量,但不知何故也会打乱 $.data,因此无论 if 的走向如何,它都会永久打乱。

在 javascript 中,当您将任何内容传递给不是基本类型的函数时(stringnumberbooleannullundefined 和 ES6 中的新 symbol),它将通过引用传递,因此当您更改 shuffle 中的 o 时,您也会更改 $.data.

为了防止这种情况,您必须从 $.data 创建一个新的 Array,然后更改创建的 Array,因此它会影响 $.data 中的值。

在你的函数中,你只需要改变

for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);

for(var j, x, i = l, o = o.slice(); i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);

我们将 o 分配给从输入的 o 创建的新数组,然后将其打乱并 return.

由于 slice 将 return 一个新数组,因此 o 现在不同于 $.data。下面是测试,您可以 运行 它并查看它记录的内容。

var a = [1, 2, 3, 4 ,5, 6, 7, 8, 9 , 10];
var b = [1, 2, 3, 4 ,5, 6, 7, 8, 9 , 10];

var len = 10;

// Origin, it return the same array that it accept.
function shuffle(o,l) {
      for(var j, x, i = l; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
}


// Altered, it'll return a new array.
function shuffleAlt(o,l) {
      for(var j, x, i = l, o = o.slice(); i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
}

var c = shuffle(a, len);
console.log(a);
console.log(c);
console.log("c === a :" , c === a);
var d = shuffleAlt(b, len);
console.log(b);
console.log(d);
console.log("d === b :" , d=== b)