创建一个新数组,将array与任何数组 或 值连接在一起
自行实现
concat:function(){ let length = arguments.length let result = [] if(!length) { return result } for(let i = 0;i<argu.length;i++) { result = result.concat(argu[i]) } return result }
lodash 实现
function concat() { var length = arguments.length; if (!length) { return []; } var args = Array(length - 1), array = arguments[0], index = length; while (index--) { args[index - 1] = arguments[index]; } return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));}
由于参数的数量不确定 所以首先想到函数免费赠送的一个参数 arguments。这点和官方的想法是一样的 。arguments是一个包含了所有参数的类数组对象,比如说第一个参数可以通过arguments[0]获取。
但是arguments参数有一个很诡异的地方,无法在箭头函数内使用,只能在普通的function内使用。
可能是和 this 一样的原因,由于箭头函数的原因,指向了父级作用域。
然后最后那里,我是用了es6提供的原生concat方法。lodash用到了他自己实现的一些方法,后面再看是什么东西。
刚刚google的时候都在说es6的新特性 rest 可以替代有很多缺陷的arguments(比如说不是真正的数组,无法在严格模式和箭头函数内使用)
ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。根据rest concat()函数可以改成下面这种形式
concat:(...p) =>{ let length = p.length let result = [] if(!length) { return result } for(let i = 0;i<p.length;i++) { result = result.concat(p[i]) } return result }
美滋滋