v8引擎数组部分的源码,出于对性能的考虑,对短数组使用的是插入排序,对长数组则使用了快速排序,也就能理解为什么() => Math.random() - 0.5并不能真正随机打乱数组排序了

// bad
function shuffle(arr) {
  arr.sort(() => Math.random() - 0.5);
}

// good
// es6
function shuffle(arr) {
  let i = arr.length;
  while (i) {
    let j = Math.floor(Math.random() * i--);
    [arr[j], arr[i]] = [arr[i], arr[j]];
  }
}

// es5
function shuffle(arr) {
  var i = arr.length, t, j;
  while (i) {
    j = Math.floor(Math.random() * i--);
    t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
  }
}

参考链接 https://www.cnblogs.com/macq/p/6650586.html