如何评估表达式?

时间:2020-06-09 15:56:18

标签: javascript

以下代码显示6。这意味着变量x似乎具有两个值 both 3(对于表达式中的左侧x)和2(减少的结果。

let x = 3
console.log(x * --x) // 6 (NOT 4)

这样做是因为在逻辑上执行表达式之前,根据关联性(在这里从左到右)解析表达式时,表达式值已被复制到缓冲区中?

同样,在此递归阶乘解中,{em}在每次递归函数调用返回后都保留x的初始值(每次通过factorial),尽管递减那时已经发生了。

function factorial(x) {
  if(!x) return 1
  return x * factorial(--x)
}

1 个答案:

答案 0 :(得分:4)

*运算符的工作方式如下:

  1. 求出左操作数;在这种情况下,x产生3
  2. 计算右侧操作数。由于--x的意思是“递减x并给我递减后的值”,因此得出2
  3. 将步骤1的结果与步骤2的结果相乘,并将其作为运算结果。

在规范here中,该部分涵盖了许多可用于数字或字符串的二进制运算符。

是的,从某种意义上讲,您可以说这些值在相乘之前已存储在缓冲区中。该缓冲区可能是CPU寄存器或堆栈位置。在您给出的factorial示例中,它将是一个堆栈位置(尽管这是一个实现细节;可以在产生指定结果的情况下以任何方式实现JavaScript引擎)。

相关问题