如何正确阅读EcmaScript规范

时间:2017-11-24 14:44:25

标签: javascript ecmascript-6

我对JavaScript二进制逻辑操作的“如何工作”知识感兴趣,但我陷入了阶段性的错误。

这是对规格的描述

  

12.13.3

     

LogicalANDExpression:LogicalANDExpression && BitwiseORExpression

     
      
  1. lref 成为评估 LogicalANDExpression 的结果。
  2.   
  3. lval 成为?的GetValue LREF )。
  4.   
  5. lbool ToBoolean lval )。
  6.   
  7. 如果 lbool 为false,返回 lval
  8.   
  9. rref 成为评估 BitwiseORExpression 的结果。
  10.   
  11. 回归?的GetValue RREF )。
  12.   

我读的就像:

  1. 为左操作数占用内存,此处为操作结果

  2. 获取内存中左操作数的值并将其转换为布尔值

  3. 如果此布尔值为false,则返回左操作数

  4. 为右操作数占用内存,这将是...... BitwiseORExpression < - 什么?按位?为了什么?为什么吗

  5. 我想以更易读的形式澄清这个算法,以了解它的工作原理。什么是p.1和p.5,究竟是什么 lref rref ,究竟是什么 LogicalANDExpression BitwiseORExpression 在那种情况下?

2 个答案:

答案 0 :(得分:2)

BitwiseORExpression 这里只是引用右侧操作数的(表达式),就像 LogicalANDExpression 指的是正确推导出的左侧的那个。它取决于您当前正在评估的代码(或者更确切地说是其解析形式,AST),它可以是basically anything,并且不需要包含|运算符。

答案 1 :(得分:1)

这就是我读它的方式(感谢Bergi的精确度):

  1. 创建引用 lref 以存储左操作数表达式 LogicalANDExpression
  2. 的评估结果
  3. 创建 lval ,获取 lref 的值(如果有的话,评估它并抛出错误)
  4. 创建 lbool ,获取与 lval
  5. 对应的布尔值
  6. 如果 lbool 为false,则整个操作将具有值 lval ,我们在此处停止(这解释了为什么0 && 'foo'获取0为结果,而不是false
  7. (如果未在先前步骤中停止)创建引用 rref 以存储右操作数表达式 BitwiseORExpression
  8. 的评估结果
  9. 整个操作将具有 rref 的值(如果有的话,仍会引发错误。这解释了为什么1 && 'foo'得到'foo'而不是{{1} }}或1