我了解到 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/