为什么有必要使用concat()/ slice(0)?

时间:2017-07-10 21:10:13

标签: javascript arrays sorting

这是来自CodeWars的问题,名为"找到中间元素"。我尝试通过以下代码解决它:

var gimme = function (a) {
    return a.indexOf(a.sort(function(a, b) { return a - b })[1]);
};

但它无法正常工作,需要添加concat()或slice(0)。正确答案是:

return a.indexOf(a.concat().sort(function(a, b) { return a - b })[1]);

但我不知道为什么?请帮帮我。

1 个答案:

答案 0 :(得分:1)

很有可能因为他们希望你以一种不会修改参数的干净方式来做这件事(这通常是应该避免的禁忌)。

通过使用concat()和/或slice(0),您可以创建数组的新实例,因此您不会修改原始输入的数组。

const a = [3,1,2];
const b = [3,1,2];

const dangerous = (arr) => arr.sort();
const safe = (arr) => arr.slice(0).sort();

const d = dangerous(a);
const s = safe(b);

console.log(a, d, a === d);
console.log(b, s, b === s);

请注意dangerous()函数如何实际更改了a,这可能会产生意外且难以发现的后果。 b不会对safe()进行更改,而是会创建新数组。