上周四的数梦工场前端开发实习生笔试有这么一道题:要求你用JS实现[1,2,3,4,5].duplicator()。当然数组是任意的
JS中数组是对象,当然可以添加方法。复制,就用数组的splice接口实现呗,看起来很简单,实则是有陷阱的。
我想到的代码是这样的:
var arr=[1,2,3,4,5];
arrar.foo=function () {
var length=arr.length;
for (var i=0;i<length;i++){
arr.splice(length+i,0,arr[i]);
}
console.log(arr);
};
arr.foo();
执行结果:
[ 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, foo: [Function] ]
是一次失败的尝试,foo也成了数组的元素,这是我们不愿意看到的。
如果你熟悉JS的原型链的话,你就会立刻想到解决方法:在原型上添加函数。每当代码读取某个对象的某个属性时,都执行一次搜索,会先后搜索实例对象,原型对象,如果有继承关系,则会向上搜索。
所以解决的代码是:
var arr=[1,2,3,4,5];
Array.prototype.foo=function () {
var length=arr.length;
for (var i=0;i<length;i++){
arr.splice(length+i,0,arr[i]);
}
console.log(arr);
};
arr.foo();
执行结果
[ 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ]