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 中,当您将任何内容传递给不是基本类型的函数时(string
、number
、boolean
、null
, undefined
和 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)
这是我正在使用的随机播放功能:
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 中,当您将任何内容传递给不是基本类型的函数时(string
、number
、boolean
、null
, undefined
和 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)