pop()/ shift()方法返回原始数组

时间:2017-12-16 01:09:29

标签: javascript node.js

我已经读过pop()/shift()比使用slice()更高效。 https://jsperf.com/pop-vs-slice/5

这是我使用slice()的用例:

proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) {
  const self = this;
  return function (err: IPseudoError) {
    if (err) {
      return self.__handle(err, false);
    }
    try {
      // remove the error-first argument
      return fn.apply(this, Array.from(arguments).slice(1));
    }
    catch (err) {
      return self.__handle(err, false);
    }
  }
};

所以这应该更高效:

  proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) {
      const self = this;
      return function (err: IPseudoError) {
        if (err) {
          return self.__handle(err, false);
        }
        try {
          const args = Array.from(arguments);
          args.shift()
          return fn.apply(this, args);
        }
        catch (err) {
          return self.__handle(err, false);
        }
      }
    };

但是我想知道是否有办法用更少的代码来做到这一点,也许是一种方法来做到这一点,而不必调用Array.from(arguments)?

也许像这样的疯狂

delete arguments[0];
return fn.apply(this, arguments);

2 个答案:

答案 0 :(得分:2)

Pop / Shift是你可以使用拼接或切片的快捷方式,但是在chrome中,pop / shift更快,删除不适合删除数组See more here的元素。

答案 1 :(得分:2)

您可以通过任何方式从参数创建新数组,但您也想跳过第一个元素。 在您的案例中,最有效的方法是使用slice Array.prototype上的arguments方法。因此,您不需要像第一种情况那样创建临时数组,然后对其进行切片,并且您不需要像第二种情况那样删除第一个元素。

proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) {
  const self = this;
  return function (err: IPseudoError) {
    if (err) {
      return self.__handle(err, false);
    }
    try {
      const args = Array.prototype.slice.call(arguments, 1);
      return fn.apply(this, args);
    }
    catch (err) {
      return self.__handle(err, false);
    }
  }
};