如果数组的元素是数值,或者是其 valueOf()方法返回数值的对象(如 Date 对象),这个比较函 数还可以写得更简单,因为这时可以直接用第二个值减去第一个值:

function compare(value1, value2){
      return value2 - value1;
}

比较函数就是要返回小于 0、0 和大于 0 的数值,因此减法操作完全可以满足要求。

对于数组中的元素,我们有很多操作方法。比如,concat()方法可以在现有数组全部元素基础上 创建一个新数组。它首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这 个新构建的数组。

如果传入一个或多个数组,则 concat()会把这些数组的每一项都添加到结果数组。 如果参数不是数组,则直接把它们添加到结果数组末尾。来看下面的例子:

let colors = ["red", "green", "blue"];
    let colors2 = colors.concat("yellow", ["black", "brown"]);
console.log(colors); // ["red", "green","blue"]
console.log(colors2); // ["red", "green", "blue", "yellow", "black", "brown"]

这里先创建一个包含 3 个值的数组 colors。然后 colors 调用 concat()方法,传入字符串"yellow" 和一个包含"black"和"brown"的数组。保存在 colors2 中的结果就是["red", "green", "blue", "yellow", "black", "brown"]。原始数组 colors 保持不变。

打平数组参数的行为可以重写,方法是在参数数组上指定一个特殊的符号:Symbol.isConcat- Spreadable。这个符号能够阻止 concat()打平参数数组。相反,把这个值设置为 true 可以强制打平 类数组对象:

let colors = ["red", "green", "blue"];
    let newColors = ["black", "brown"];
    let moreNewColors = {
      [Symbol.isConcatSpreadable]: true,
      length: 2,
      0: "pink",
      1: "cyan"
    };
    newColors[Symbol.isConcatSpreadable] = false;
// 强制不打平数组
let colors2 = colors.concat("yellow", newColors);
// 强制打平类数组对象
let colors3 = colors.concat(moreNewColors);
console.log(colors); // ["red", "green", "blue"]
console.log(colors2); // ["red", "green", "blue", "yellow", ["black", "brown"]] console.log(colors3); // ["red", "green", "blue", "pink", "cyan"]

接下来,方法 slice()用于创建一个包含原有数组中一个或多个元素的新数组。slice()方法可以 接收一个或两个参数:返回元素的开始索引和结束索引。如果只有一个参数,则 slice()会返回该索引 到数组末尾的所有元素。如果有两个参数,则 slice()返回从开始索引到结束索引对应的所有元素,其 中不包含结束索引对应的元素。记住,这个操作不影响原始数组。来看下面的例子:

let colors = ["red", "green", "blue", "yellow", "purple"];
    let colors2 = colors.slice(1);
    let colors3 = colors.slice(1, 4);
    alert(colors2);  // green,blue,yellow,purple
    alert(colors3);  // green,blue,yellow

这里,colors 数组一开始有 5 个元素。调用 slice()传入 1 会得到包含 4 个元素的新数组。