Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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 ECMAScript文档中的SpreadElement是什么?它与MDN的扩展语法相同吗?_Javascript_Ecmascript 6_Spread Syntax - Fatal编程技术网

Javascript ECMAScript文档中的SpreadElement是什么?它与MDN的扩展语法相同吗?

Javascript ECMAScript文档中的SpreadElement是什么?它与MDN的扩展语法相同吗?,javascript,ecmascript-6,spread-syntax,Javascript,Ecmascript 6,Spread Syntax,最后,描述了 SpreadElement[Yield]: ...AssignmentExpression[In, ?Yield] 这和那个一样吗 扩展语法允许在预期零个或多个参数(用于函数调用)或元素(用于数组文字)的位置展开iterable,例如数组表达式或字符串,或者在预期零个或多个键值对(用于对象文字)的位置展开object表达式 语法 对于函数调用: myFunction(...iterableObj); 对于数组文字: [...iterableObj, 4, 5, 6] 在文档中

最后,描述了

SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
这和那个一样吗

扩展语法允许在预期零个或多个参数(用于函数调用)或元素(用于数组文字)的位置展开iterable,例如数组表达式或字符串,或者在预期零个或多个键值对(用于对象文字)的位置展开object表达式

语法

对于函数调用:

myFunction(...iterableObj);
对于数组文字:

[...iterableObj, 4, 5, 6]
在文档中描述


SpreadElement
和或spread语法的用例是什么;如果
SpreadElement
和spread语法不同,它们在哪些具体方式上有所不同?

SpreadElement
在ES6语法中只是spread“operator”的一个名称,当它位于数组文字中时,它的参数是:

SpreadElement[Yield]:
    ... AssignmentExpression[In, ?Yield]
因此,
[a,b,…c]
中的
元素
…c
;排列“运算符”是
。(害怕引用,因为它不是真正的运算符,例如,
-
是。)

函数调用中使用的语法规则的名称将不同,因为它是不同的语法上下文(它只是一种
参数列表
)。

术语“扩展运算符”是一种“伞形术语”,指ES6中的各种语法结构,它们看起来都像
…x
。MDN也这样做

但是,这是误导,因为
不是运算符(至少在ECMAScript规范使用术语“运算符”的意义上不是)。它不会生成可用于进一步计算的值。我宁愿将它与其他标点符号进行比较,例如
(也有点相关,但在不同的上下文中有不同的含义)

术语“差价经营者”可指:

  • :扩展元素将iterable(
    c
    )扩展到新数组中。它相当于类似于
    [a,b].concat(c)

  • :在解构内部,
    ..
    构造具有相反的效果:它将剩余元素收集到一个数组中。这里的例子相当于

    a = arr[0];
    b = arr[1];
    c = arr.slice(2);
    
    (请注意,这只是一个近似值,因为解构作用于任何iterable值,而不仅仅是数组)

  • fun(a,b,…c)
    :这个构造。但它的工作原理与扩展元素非常相似:它将iterable扩展到参数列表中。
    它相当于
    func.apply(null[a,b].concat(c))

    缺少正式名称可能是人们开始使用“spread operator”的原因。我可能会称之为“扩散争论”

  • :与rest元素类似,rest参数收集传递给函数的剩余参数,并使它们在
    c
    中作为数组可用。ES2015规范实际上使用术语
    BindingRestElement
    来指代此构造

相关问题:



:如果我们非常迂腐,我们甚至必须区分变量声明(
var[a,b,…c]=d;
)和简单赋值(
[a,b,…c]=d;
),根据规范。

SpreadElement
只是ES6语法中省略运算符的一个名称”什么是“省略运算符”,
SpreadElement
是ES6规范中的一条语法规则,正如我在上面所解释的,它涵盖的不仅仅是
操作符。MDN将
称为“操作员”,因为上下文中的意思很清楚,只有学究才会坚持
语法结构
或其他什么。你在玩游戏吗?“为什么MDN使用术语操作符?”上面回答:“MDN将
称为“操作符”,因为上下文中的意思很清楚,只有学究才会坚持句法结构或其他东西。”。“SpreadElement还包括哪些内容?”上面回答:“
中的
SpreadElement
…c
;spread”操作符“是
”。“什么是‘书呆子’?”找一本字典。@guest271314-ECMA-262是语言规范,所以它是权威。MDN是一个任何人都可以贡献的公共wiki,它不是任何事情的权威。对于记录(和学究),
..
是构成SpreadElement一部分的标记。@guest271314:您可能想看看关于
..
标记如何构成运算符的注释。对于函数调用,我个人会说它的REST参数,而不是spread运算符。然而,它们的用途和实现方式几乎相同。@choz:Eh,如果我们想更准确地说,它应该在调用中传播,其余的在定义中:
x=f(a,…b)
传播
b
函数f(a,…b)
将其余的参数收集到
b
。与数组相同:在文本
x=[a,…b]
中,它是分散的,在解构赋值
[a,…b]=x
中,它是剩余的。@Amadan在
x=f(a,…b)
中,
b
必须是一个iterable对象。我认为这仍然是所谓的。函数f(a,…b)
,使得
b
必须排在最后,并且能够包含其余的参数。所以,我称之为@choz:我想你刚才说的正是我所做的:PYes,整个要点是,顺便说一下,因为“
不是运算符”部分,我为此创建了一个CW规范(如果你还没有看到的话):解释得更详细一点,尽管晚了一年。