Javascript 如何从“切”中获取切片;“论点”;
您所知道的是,Javascript 如何从“切”中获取切片;“论点”;,javascript,Javascript,您所知道的是,arguments是一个特殊的对象,它保存传递给函数的所有参数 只要它不是数组,就不能使用像arguments.slice(1)这样的东西 所以问题是-如何从参数中分割除第一个元素以外的所有元素 UPD: 似乎没有办法不将其转换为具有 var args = Array.prototype.slice.call(arguments); 如果有人发布了另一个解决方案,那就太好了,如果没有,我会用上面的一行作为答案检查第一个解决方案。Q.如何从参数中分割除第一个元素以外的所有元素? 以
arguments
是一个特殊的对象,它保存传递给函数的所有参数
只要它不是数组,就不能使用像arguments.slice(1)
这样的东西
所以问题是-如何从参数中分割除第一个元素以外的所有元素
UPD:
似乎没有办法不将其转换为具有
var args = Array.prototype.slice.call(arguments);
如果有人发布了另一个解决方案,那就太好了,如果没有,我会用上面的一行作为答案检查第一个解决方案。Q.如何从参数中分割除第一个元素以外的所有元素?
以下内容将返回一个数组,其中包含除第一个参数外的所有参数:
var slicedArgs = Array.prototype.slice.call(arguments, 1);
您不必首先将参数
转换为数组,只需一步即可完成。您可以通过循序渐进地遍历arguments对象来“切片而不切片”:
function fun() {
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
return args;
}
fun(1, 2, 3, 4, 5); //=> [2, 3, 4, 5]
函数fun(){
var args=[];
for(var i=1;i[2, 3, 4, 5]
来自:
您不应该对参数进行切片,因为它会阻止在中进行优化
JavaScript引擎(例如V8)。相反,尝试构建一个新的
通过遍历arguments对象来创建数组
因此,保罗·罗西亚纳(Paul Rosiana)上述回答是正确的这可能是一种方式:
var args = Array.from(arguments).slice(1);
实际上不需要干预数组函数。
使用…rest
更干净、更方便
示例
函数参数测试(第一,…其余){
console.log(“第一个参数:+First”);
//循环遍历其余的参数
for(让arg代替其余部分){
控制台日志(“-”+arg);
}
}
//使用任意数量的参数调用函数
argumentTest(“第一个参数”,“第二个”,“更多参数”,“这不是一个参数,而是一个矛盾”)代码>您可以使用方法[].slice.call(参数,1)
[].slice将返回slice函数对象,您可以调用它作为参数
,1
是参数您可以在函数中使用…rest来分隔第一个参数和其余参数:
函数foo(arr){
常量[第一,…剩余]=参数;
log(`first=${first}`);
log(`rest=${rest}`);
}
//然后使用3个参数调用函数:
foo(1,2,3)
是的,它完成了工作,但如果我们有一个.slice()
;-),它就没有意义了当然,使用Array.prototype.slice更容易,但您的问题是是否有其他方法。是的,谢谢;-)(虽然很明显我知道关于
:-P)哈哈,我希望我听起来不是陈词滥调。有时这是有用的信息,所以+1这似乎是V8的唯一正确解决方案。看看这里的优化基准:我认为这有一个缺点。如果只有一个附加参数(除第一个参数外),则不会返回任何内容。建议您不应使用切片参数,因为这会阻止JavaScript引擎优化。可以找到更详细的解释,似乎不再存在不使用切片参数的建议。“更多细节”链接似乎没有更多相关细节。现在看来这绝对是正确的答案。@David-“详细信息”链接仍然说不要在参数上使用.slice()
,但给出的唯一原因是它阻止JS引擎优化函数。所以这并不是说它失败了,只是可能会慢一些。我不打算编写代码来迎合当今JS引擎的优化,也不打算等到明天的引擎可能已经解决了优化问题,而且在任何情况下,用户在大多数情况下都可能感觉不到这种差异。最好先编写清晰且易于维护的代码,然后只有在出现可测量的性能问题时才回来优化。也许是这样。但我不明白优化引擎怎么会不能处理被接受的答案的一行,并以他们希望的任何方式优化它。从长远来看,如果我们开始为优化器(现在)编码,这总是一件麻烦事——我个人更喜欢代码的清晰性。“切片”不会改变。它返回原始数组中元素的浅层副本。原始数组的元素被复制到返回的数组中。因此,我无法理解手动复制到新阵列和切片之间的区别。截至2018年,警告不再存在。我想我们应该是安全的。现在根本没有必要了:函数foo(…args)
@zerkms出于性能原因,我本来打算驳回您的建议,但我的测试显示rest参数是最快的解决方案@CodyAllanTaylor的实现得到了改进。除非你有非常重要的理由不这么做,否则我会坚持使用更具可读性的语法+zerkms,这确实是一种比使用参数
并将其转换为数组等更好的方法。请参见下面我的答案。是的,我同意现在更方便。我对你投了更高的票,但我不会回顾性地更改经过检查的5年前的答案。现在,又过了一年,我认为是时候切换到新的ES标准了:-)当你一年前的答案得到+15分时的那种感觉:-d这不适用于不支持此功能的较旧Qt版本☹在发布您的答案之前,您是否检查了已发布的答案?相同的答案(甚至稍好一点,因为它没有分配一次性数组)已经发布并被检查。耶,未来终于来了:-D