我已经读过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);
答案 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);
}
}
};