gpt4 book ai didi

javascript - 它是传播 "syntax"还是传播 "operator"?

转载 作者:行者123 更新时间:2023-12-02 22:36:18 25 4
gpt4 key购买 nike

我听说过 ...被称为“扩展语法”和“扩展运算符”,后者更受欢迎。相关网址MDN documentation表明它最初被称为扩展运算符,但后来改为扩展语法,和 MDN's list of operators没有提到它。

谷歌似乎暗示运营商这个词更受欢迎和被接受,例如 Microsoft documentation 等网站。和 es6-features.org如此称呼它。

在 ECMAScript 的上下文中,哪个术语最正确(如果有的话),为什么?数组解构赋值呢?

最佳答案

它不是运营商。

在这个词的所有意义上,它都不是一个。自从它被引入以来一直是一个巨大的误解,尽管有流行的意见——它不是一个,并且有一些客观的观点需要提出:

  • 不符合运算符的定义
  • 不能用作运算符
  • 语言规范暗示它不是运算符

  • 应该提到的是,扩展语法有不同的“风格”,在不同的上下文中使用,并且在使用相同标点符号时通常以不同的名称引用。传播语法基本上是 ... 标点符号应用的总称,请参阅 Felix Kling 详细说明所有用法和名称的精彩答案。 the supplementary answer 中给出了有关这些个人用途的更多解释。

    什么是运算符?

    从语义上讲,在 ECMAScript 的上下文中,运算符只是内置函数,它们接受参数并计算出单个值——用前缀、中缀或后缀表示法编写,通常带有符号名称,例如 +/ 。从 Wikipedia :

    Simply, an expression involving an operator is evaluated in some way, and the resulting value may be just a value (an r-value), or may be an object allowing assignment (an l-value).



    例如, + 运算符产生一个诸如 2 之类的值,这是一个右侧表达式,而 . 运算符产生一个允许赋值的对象,例如 foo.bar,一个左侧表达式表达。

    从表面上看, ... punctuator1 看起来是一个前缀一元运算符:
    const baz = [foo, ...bar];

    但该论点的问题在于 ...bar 不计算为奇异值;它一个一个地传播可迭代的 bar 的元素。传播参数也是如此:
    foo(...bar);

    在这里, foo 从可迭代对象 bar 接收单独的参数。它们是传递给 foo 的单独值,而不仅仅是一个值。它不符合运算符的定义,所以它不是一个。

    为什么不是运营商?

    另一点要说明的是,运算符是独立的并返回单个值。例如:
    const bar = [...foo];

    如前所述,这很有效。当您尝试执行此操作时会出现问题:
    const bar = ...foo;

    如果 spread 语法是一个运算符,则后者可以正常工作,因为运算符将表达式计算为单个值,但 spread 不是,因此它会失败。传播语法和传播参数仅适用于数组和函数调用的上下文,因为这些结构接收由传播数组元素或参数提供的多个值。对多个值求值超出了运算符(operator)的能力范围。

    标准怎么说?

    运算符的完整列表列在 ECMAScript 2015 Language Specification 的第 12.5 至 §12.15 节中,该规范中引入了 ...,但未提及 ...。也可以推断出它不是运算符。此答案中提到的两个主要情况,其中扩展语法在生产中,用于函数调用(扩展参数)或 array literals(扩展语法)如下所述:

    ArrayLiteral :  [ Elisionopt ]  [ ElementList ]  [ ElementList , Elisionopt ]ElementList :  Elisionopt AssignmentExpression  Elisionopt SpreadElement  ElementList , Elisionopt AssignmentExpression  ElementList , Elisionopt SpreadElementElision :  ,  Elision ,SpreadElement :  ... AssignmentExpression  


    而对于 function calls :

    CallExpression :  MemberExpression ArgumentsArguments :  ( )  ( ArgumentList )ArgumentList :  AssignmentExpression  ... AssignmentExpression  ArgumentList , AssignmentExpression  ArgumentList , ... AssignmentExpression  


    在这些作品中,可以得出一个结论:传播“运算符”不存在。正如前面提到的,运算符应该是独立的,如 const bar = ...foo 并计算为一个值。该语言的语法阻止了这种情况,这意味着传播语法从来都不是独立的。它是数组初始值设定项和函数调用的扩展,是它们语法的扩展。

    为什么要传播“语法”?

    Wikipedia 定义的语法:

    In computer science, the syntax of a computer language is the set of rules that defines the combinations of symbols that are considered to be a correctly structured document or fragment in that language.



    语法基本上是语言的“形式”,规则是控制什么是合法的,什么是合法的,什么是代码的外观,以及代码应该如何编写。在这种情况下,ECMAScript 的语法专门定义了 ... 标点符号仅作为扩展出现在函数调用和数组文字中——这是一个定义被认为是合法的符号组合 ( ...foo) 的规则,因此,它的语法类似于箭头函数( =>)不是运算符,而是语法 2。

    ... 称为运算符是用词不当。运算符是一个内置函数,它接受参数(操作数)并采用前缀、中缀或后缀符号 的形式,并且计算结果恰好是一个值 ... ,虽然满足前两个条件,但不满足最后一个。 ... 是语法,因为它是在语言的语法中明确明确定义的。因此,“扩展运算符”在客观上更正确地称为“扩展语法”。

    1 术语“标点符号”指的是 punctuators in ECMAScript 2015 和更高版本的规范。这些符号包括语法组件和运算符,并且是语言的标点符号。 ... 本身就是一个标点符号,但术语“扩展语法”是指标点符号的整个应用。

    2 => 本身是一个标点符号,就像 ... 但我具体指的是箭头函数语法, => 标点符号( (…) => { … } )的应用,就像扩展语法是指应用 ... 标点符号。

    关于javascript - 它是传播 "syntax"还是传播 "operator"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44934828/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com