pop()/ shift()方法返回原始数组
我已经读过pop()/shift()
比使用slice()
更高效。
这是我使用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);
回答如下:
您可以通过任何方式从参数创建新数组,但您也想跳过第一个元素。在你的情况下,最有效的方法是在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);
}
}
};