首先先看一段代码
let n = 2;
let t = {
get m() { return ++n }
};
console.log(t.m**t.m**t.m);
这段代码的结果是多少可以先猜一猜 >>>>>
你的答案是不是:5.421010862427522e+44
哈哈,可以尝试在控制台上运行一下,可以得出这个段代码的结果是:Infinity
为什么会得出这个结果,首先我们要厘清三个概念:
-
getter
-
左结合和右结合
-
求值顺序
1. getter
在对象方法前加上 get 关键字,在调用时候就可以使用【对象点属性名】即可获取返回值,否则需要加上括号。这个被称为访问器属性,在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。
getter 适合的场景也是在需要允许访问返回动态计算值的属性,这样外部调用时候就像使用了一个属性一样
2. 左结合和右结合
一个最简单的加法运算
let [a, b, c] = [1, 2, 3];
console.log(a + b + c) // 6
这个计算的过程是先 a+b = 3,再用 3 + c = 6,最后得到 6,是左结合的运算方式
而求幂运算符是是右结合的:a ** b ** c = a ** (b ** c)
所以是这是从右边开始计算的
3. 求值顺序
其实不论是左结合还是右结合,求值的结果都是从左边开始赋值,和左结合的顺序是相同的
>>>>>>>>
所以开头的代码的执行如下:
let n = 2;
let t = {
get m() { return ++n }
};
console.log(t.m**t.m**t.m); // console.log(3**(4**5))
实际最后计算的是:3**(4**5) 这一结果