乐趣区

lodash数组篇之3-concat

创建一个新数组,将 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
    }

美滋滋

退出移动版