如果 console.log(...arguments) 正常,为啥 var a = ...arguments 会失败?

Posted

技术标签:

【中文标题】如果 console.log(...arguments) 正常,为啥 var a = ...arguments 会失败?【英文标题】:Why does var a = ...arguments fail, if console.log(...arguments) is OK?如果 console.log(...arguments) 正常,为什么 var a = ...arguments 会失败? 【发布时间】:2016-11-02 10:49:27 【问题描述】:

代码 A,没关系,记录 [ 1, 2, 3 ]

function fn() 
    console.log(...arguments);


fn([1, 2, 3]);

代码 B,这失败了 SyntaxError: Unexpected token ... 此外,将 ...arguments 包裹在 () 中也无济于事。

function fn() 
    var a = ...arguments;


fn([1, 2, 3]);

我假设在这两种情况下,我们都有一个RHS 查找。为什么可以将...arguments 传递给console.log(或其他函数),但不能将其分配给变量?

PS。我知道这永远不会出现在现实生活中的代码中,或者有其他更好的解决方案。我的问题纯粹是理论上/概念性的,仅限于理解为什么会发生不同的行为。

【问题讨论】:

你不能把它分配给a而不是...吗? var a = arguments[0]; //Your array. @Arg0n 当然,正如我所指出的,这不是现实生活软件中的实际问题。当分配需要明确的[ ] 才能使其工作时,我只是惊讶于为什么...arguments 会作为数组传递给console.log(无需将其包装在[ ] 中)。 【参考方案1】:

展开语法的两种应用是:

    将可迭代值的项转换为函数调用的参数 将可迭代项转换为数组元素

所以这行得通:

function fn() 
    var a = [...arguments];

【讨论】:

@DrunkenMaster 尝试这样称呼它:fn(1, 2, 3); 这就是 restful 参数的工作方式。您只提供一个参数(一个数组)。你也可以这样做:fn([1, 2, 3], [4, 5, 6]); //a = [[1, 2, 3], [4, 5, 6]]. 真的这应该使用传播参数寿。 function fn(...a) ... 实现与您的功能完全相同的功能,但没有讨厌的 arguments 魔法 我认为将这种语法称为运算符非常具有误导性。甚至问题都是基于这种误解,将其视为具有返回值的运算符。它被正式称为spread syntax【参考方案2】:

它不像在 CODE B 中那样工作...无效的语法

你可以像这样在 fn 参数中传播

function fn(...params) 

  ...

ArrayObject

var a = [1,2,3,4,5],
b = [6,...a];

var x = a:1,b:1,
y = c:1,...x

【讨论】:

以上是关于如果 console.log(...arguments) 正常,为啥 var a = ...arguments 会失败?的主要内容,如果未能解决你的问题,请参考以下文章

如果 console.log(...arguments) 正常,为啥 var a = ...arguments 会失败?

如果 console.log(4) 在 Chrome 控制台中输出 undefined 是啥意思?

简述alert和console.log的区别

java web编程中console.info 和console.log 有啥区别

JS---异常

console.log()的作用是什么