以下代码显示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)
}
答案 0 :(得分:4)
*
运算符的工作方式如下:
x
产生3
。--x
的意思是“递减x
并给我递减后的值”,因此得出2
。在规范here中,该部分涵盖了许多可用于数字或字符串的二进制运算符。
是的,从某种意义上讲,您可以说这些值在相乘之前已存储在缓冲区中。该缓冲区可能是CPU寄存器或堆栈位置。在您给出的factorial
示例中,它将是一个堆栈位置(尽管这是一个实现细节;可以在产生指定结果的情况下以任何方式实现JavaScript引擎)。