ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 是…… foo是运算符还是语法?

2019-09-15 12:42:48  阅读:162  来源: 互联网

标签:spread-syntax javascript ecmascript-6 language-lawyer


我听说过……将它们称为“传播语法”和“传播运算符”,后者更受欢迎.相关MDN documentation的URL表明它最初被称为扩展运算符,但后来改为扩展语法,MDN’s list of operators没有提到它.

谷歌似乎建议术语操作符更受欢迎和接受,Microsoft documentationes6-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不能评估为奇异值;它逐个传播可迭代栏的元素.传播参数也是如此:

foo(...bar);

这里,foo从可迭代栏接收单独的参数.它们是传递给foo的单独值,而不仅仅是一个值.它不符合运算符的定义,因此它不是一个.

为什么不是操作符?

另一个要点是操作符应该是独立的并且返回单个值.例如:

const bar = [...foo];

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

const bar = ...foo;

如果扩展语法是一个运算符,后者将正常工作,因为运算符将表达式计算为单个值,但传播不会因此失败.扩展语法和扩展参数仅在数组和函数调用的上下文中起作用,因为这些结构接收通过扩展数组元素或参数提供的多个值.评估多个值超出了运算符能够做的范围.

标准说什么?

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

06004

而对于function calls

06005

在这些作品中,可以得出结论:传播’操作符’不存在.如前所述,运算符应该是独立的,如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)因此它的语法类似于箭头函数(=>)不是运算符,而是syntax2.

呼叫……操作符是用词不当.运算符是一个内置函数,它接受参数(操作数)并采用前缀,中缀或后缀表示法的形式,并且只计算一个值. ……,虽然满足前两个条件,但不满足最后一个条件. …相反,是语法,因为它是在语言的语法中明确定义的.因此,“扩展运算符”客观上更准确地称为“扩展语法”.

1术语“标点符号”是指punctuators in ECMAScript 2015及以后的规范.这些符号包括语法组件和运算符,并且是语言的标点符号. ……本身就是一个标点符号,但术语“传播语法”指的是标点符号的整个应用.

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

标签:spread-syntax,javascript,ecmascript-6,language-lawyer
来源: https://codeday.me/bug/20190915/1804883.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有