gpt4 book ai didi

javascript - Javascript 中箭头函数(粗箭头 =>)的确切解析优先级是什么?

转载 作者:可可西里 更新时间:2023-11-01 02:22:00 24 4
gpt4 key购买 nike

我从 eslint documentation 看到了一个例子关于箭头函数:

// The intent is not clear
var x = a => 1 ? 2 : 3;

所以我研究了一下箭头函数的优先级。似乎 => 不被视为运算符,因为在 table of operator precedence on MDN 上找不到它。 .从页面 arrow functions , 它说

arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.

但它没有进一步详细说明特殊的解析规则。所以我的问题是,关于箭头函数的优先规则是什么?


根据我的测试,它的优先级似乎高于赋值,但低于条件(三元)运算符?

var x = 0, a = 5;
console.log(x = a => 1 ? 2 : 3);
// same as x = (a => (1 ? 2 : 3))
console.log(x);
console.log(a);

但我不确定这在不同的浏览器和平台上是否一致。任何人都可以对这种行为给出明确的答案吗?

最佳答案

如您所说,=> 不是运算符。箭头函数是主要语法。

它们的规则在规范中定义,从 ArrowFunction production 开始. ArrowFunction 定义为 ArrowParameters 后跟 => 后跟误导性命名的 ConciseBody . ConciseBody 有两种形式。您正在使用 ExpressionBody 询问表单,这是 => 之后的第一个非空白标记 不是 { 的地方。如果那里有一个左大括号,它将表示一个名为 FunctionBody 的 block 的开头。

ExpressionBody定义很简单:它是一个 AssignmentExpression .

这让我们进入了非常熟悉的领域,因为 AssignmentExpression 是赋值(或变量初始值设定项)右侧的语法、数组初始值设定项中的条目、属性的值部分初始化器,函数的参数等。因此,在简洁的主体中 => 之后的任何内容都与我们在下面的 AssignmentExpression 中放置的内容具有相同的解析规则:

x = AssignmentExpression;
y = AssignmentExpression, z = AssignmentExpression;
a1 = [AssignmentExpression];
a2 = [AssignmentExpression, AssignmentExpression];
o1 = {foo: AssignmentExpression};
o2 = {foo: AssignmentExpression, bar: AssignmentExpression};
doSomething(AssignmentExpression);
doSomething(AssignmentExpression, AssignmentExpression);

只是为了详细说明,AssignmentExpression 是以下任何一种:


(您可能想知道,as I didx = y 中的 y 如何匹配上面定义的 AssignmentExpression,因为 y 显然是一个 Identifier 并且这些看起来都不会导致 Identifier 的产生。这就是规范很难阅读的地方。事实证明如果你继续走足够长的时间,你就会到达那里。路径是(深呼吸):AssignmentExpressionConditionalExpressionLogicalORExpressionLogicalANDExpressionBitwiseORExpressionBitwiseXORExpressionBitwiseANDExpressionEqualityExpressionRelationalExpressionShiftExpressionAdditiveExpressionMultiplicativeExpressionExponentiationExpressionUnaryExpressionUpdateExpressionLeftHandSideExpressionNewExpressionMemberExpressionPrimaryExpressionIdentifierReferenceIdentifier - 哇! [抹眉头]。谢谢奥里奥尔!)

关于javascript - Javascript 中箭头函数(粗箭头 =>)的确切解析优先级是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50461820/

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