Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从“切”中获取切片;“论点”;_Javascript - Fatal编程技术网

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