主要是分析代码,提供思路,方便去理解。
Array.prototype.myConcat = function() {
let newArr = this.slice(0)
Array.prototype.slice.apply(arguments).forEach(item = >{
if (item instanceof Array) {
item.forEach(Array_item = >{
newArr.push(Array_item)
})
} else {
newArr.push(item)
}
})
return newArr
}
let a = [1, 2, 3, 4]
let b = a.myConcat([5, 6])
let c = a.myConcat([5, 6], 7)
console.log(b) // [1, 2, 3, 4, 5, 6]
console.log(c) // [1, 2, 3, 4, 5, 6, 7]
-
let newArr = this.slice(0),由于需要返回到新的数组,因此使用this.slice(0)对原数组进行深拷贝,返回一个新的数组。
-
Array.prototype.slice.apply(arguments),由于arguments是类数组,无法使用forEach,使用该方法就能将其变为数组。
-
item instanceof Array,由于arguments中的item可能是一个数组,可能是其他的类型,例如let c = a.myConcat([5, 6], 7),因此需要先使用instanceof判断该item是否为Array。如果是,则再次使用forEach遍历,使用push将Array_item添加到newArr中,如果否,则直接使用push将item添加到newArr中。
- 最后
return newArr。