get 引发的思考

91 阅读1分钟

首先先看一段代码

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) 这一结果