Javascript 中对数组洗牌、清空

Posted by cl9000 on June 02, 2020

一个人的价值,应该看他贡献什么,而不应当看他取得什么。 ——<阿尔伯特·爱因斯坦>

对数组进行洗牌

这段代码运用了 Fisher-Yates Shuffling算法 对数组进行洗牌。
https://www.wikiwand.com/en/Fisher%E2%80%93Yates_shuffle

1
2
3
4
5
6
7
8
9
10
11
12
function shuffle(arr) {
var i,
j,
temp;
for (i = arr.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
};

调用示例:

1
2
3
4
var a = [1, 2, 3, 4, 5, 6, 7, 8];
var b = shuffle(a);
console.log(b);
// [2, 7, 8, 6, 5, 3, 1, 4]

清空数组

如果你定义了一个数组,然后你想清空它。 通常,你会这样做:

1
2
3
4
5
6
7
// 定义一个数组
var list = [1, 2, 3, 4];
function empty() {
//清空数组
list = [];
}
empty();

但是,这有一个效率更高的方法来清空数组。 你可以这样写:

1
2
3
4
5
6
var list = [1, 2, 3, 4];
function empty() {
//empty your array
list.length = 0;
}
empty();
  • list = [] 将一个新的数组的引用赋值给变量,其他引用并不受影响。 这意味着以前数组的内容被引用的话将依旧存在于内存中,这将导致内存泄漏。
  • list.length = 0 删除数组里的所有内容,也将影响到其他引用。

然而,如果你复制了一个数组(A 和 Copy-A),如果你用 list.length = 0 清空了它的内容,复制的数组也会清空它的内容。

考虑一下将会输出什么:

1
2
3
4
5
6
7
8
9
var foo = [1,2,3];
var bar = [1,2,3];
var foo2 = foo;
var bar2 = bar;
foo = [];
bar.length = 0;
console.log(foo, bar, foo2, bar2);

//[] [] [1, 2, 3] []

更多内容请看Stackoverflow: difference-between-array-length-0-and-array
https://stackoverflow.com/questions/4804235/difference-between-array-length-0-and-array

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!