所谓面试题,总是喜欢考一些冷僻的,或者细节性的东西。
这是一道传说中的国外的前端面试题。来自
原体如下:

Make this work:
[1,2,3,4,5].duplicator(); // [1,2,3,4,5,1,2,3,4,5]

立刻想到了 js 有数组拼接的方法:concat();


function duplicator() {
	var nArray = [];
	var origin = this;
	for (var i = origin.length - 1; i >= 0; i--) {
		nArray[i] = origin[i];
	};
	return origin.concat(nArray);
}
Array.prototype.duplicator = duplicator;
console.log([1,2,3,4,5].duplicator());

这该是最容易想到的方法,创建了新的数组,然后通过 for 循环遍历数组元素,并存入 nArray 中,这样就得到了一个一样的数组,然后使用 concat() 方法拼接即可。

然后,作为一个前端,我们需要想如何减少代码量 “Write less, do more!”。
于是,不就是复制数组嘛,复制数组还有更巧妙的方法。
原生数组有个切割数组的方法 slice() ,将其第一个参数设置为数组切割起始点 0, 省略第二个参数,就可以做到将整个数组切割,也就是完成了复制。


function duplicator() {
	return this.concat(this.slice(0));
}
Array.prototype.duplicator = duplicator;
console.log([1,2,3,4,5].duplicator());

慢着,我们似乎多此一举了。。


function duplicator() {
	return this.concat(this);
}
Array.prototype.duplicator = duplicator;
console.log([1,2,3,4,5].duplicator());

引申,其实 concat() 方法也可以复制数组的。


function clone() {
	return [].concat(this);
}

将此函数添加为数组的方法就可以用来复制数组了。