gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:28:34 25 4
gpt4 key购买 nike

我读到 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);

最佳答案

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

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);
}
}
};

关于javascript - 返回原始数组的 pop()/shift() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com