Javascript 在类成员函数中使用常量变量的最快方法?

Javascript 在类成员函数中使用常量变量的最快方法?,javascript,Javascript,我想知道在下面三个选项之间使用常量变量最有效的方法是什么 const a = 1; const b = 2; const c = 3; class Test { constructor(){ this.a = 1; this.b = 2; this.c = 3; } optionA() { return a + b + c; } optionB() { return this.a + this.

我想知道在下面三个选项之间使用常量变量最有效的方法是什么

const a = 1;
const b = 2;
const c = 3;

class Test {
    constructor(){
      this.a = 1;
      this.b = 2;
      this.c = 3;
    }
    optionA() {
      return a + b + c;
    }
    optionB() {
      return this.a + this.b + this.c;
    }
    optionC() {
      const _a = 1;
      const _b = 2;
      const _c = 3;
      return _a + _b + _c;
    }
}

我知道差别很小,但是如果其中一个函数被用于一个大的“for”循环呢?
optionC()
中的局部变量赋值会比访问成员或全局变量花费更长的时间吗?如果我使用
const
而不是
let
,Javascript是否会进行内部优化?

仅从阅读代码来看,optionA似乎是最有效的。但是让我们用控制台来测试这个理论

常数a=1;
常数b=2;
常数c=3;
课堂测试{
构造函数(){
这是a=1;
这是b=2;
这个c=3;
}
选项a(){
返回a+b+c;
}
选项b(){
返回这个.a+this.b+this.c;
}
选项c(){
常数a=1;
常数b=2;
常数c=3;
返回a+b+c;
}
}
const lala=新测试();
log('运行每个选项一次');
时间('a');lala.optionA();控制台。时间结束('a');
时间('b');lala.optionB();控制台。时间结束('b');
控制台。时间('c');lala.optionC();控制台。时间结束('c');
console.log('-------------------------------------');
log('每个选项运行10000次');
时间('a');
对于(设a=0;a<10000;a++){lala.optionA();}
控制台。时间结束('a');
时间('b');
对于(设b=0;b<10000;b++){lala.optionB();}
控制台。时间结束('b');
控制台。时间('c');
对于(设c=0;c<10000;c++){lala.optionC();}
控制台。时间结束('c');

log('-------------------------------------')
仅从阅读代码来看,optionA似乎是最有效的。但是让我们用控制台来测试这个理论

常数a=1;
常数b=2;
常数c=3;
课堂测试{
构造函数(){
这是a=1;
这是b=2;
这个c=3;
}
选项a(){
返回a+b+c;
}
选项b(){
返回这个.a+this.b+this.c;
}
选项c(){
常数a=1;
常数b=2;
常数c=3;
返回a+b+c;
}
}
const lala=新测试();
log('运行每个选项一次');
时间('a');lala.optionA();控制台。时间结束('a');
时间('b');lala.optionB();控制台。时间结束('b');
控制台。时间('c');lala.optionC();控制台。时间结束('c');
console.log('-------------------------------------');
log('每个选项运行10000次');
时间('a');
对于(设a=0;a<10000;a++){lala.optionA();}
控制台。时间结束('a');
时间('b');
对于(设b=0;b<10000;b++){lala.optionB();}
控制台。时间结束('b');
控制台。时间('c');
对于(设c=0;c<10000;c++){lala.optionC();}
控制台。时间结束('c');

log('-------------------------------------')
这是一个相当抽象的问题,但我认为

选项A将是最快的,但这只是因为在“http get网站”上有额外的几个字符可供下载

解释器将选项B解析为与选项A相同的含义,但在1)解析“this.”部分和2)解析不带A的变量时涉及到一些工作。这是类变量,而不是方法范围中的auto。它可以走任何一条路,这取决于口译员是如何构建的

对于选项C,如果您实例化了大量测试对象,那么选项C意味着您不需要推送大量字节。(每个物体的尺寸为3*sizeof(常数)

我自己选择选项D,因为您会注意到选项D绝对不涉及处理器工作


好问题。

这是一个相当抽象的问题,但我认为

选项A将是最快的,但这只是因为在“http get网站”上有额外的几个字符可供下载

解释器将选项B解析为与选项A相同的含义,但在1)解析“this.”部分和2)解析不带A的变量时涉及到一些工作。这是类变量,而不是方法范围中的auto。它可以走任何一条路,这取决于口译员是如何构建的

对于选项C,如果您实例化了大量测试对象,那么选项C意味着您不需要推送大量字节。(每个物体的尺寸为3*sizeof(常数)

我自己选择选项D,因为您会注意到选项D绝对不涉及处理器工作


好问题。

Dunno,Dunno,no。JS不会优化任何东西,实现会。答案可能因发动机而异。不管怎样,你为什么关心呢?不,不。JS不会优化任何东西,实现会。答案可能因发动机而异。不管怎样,你为什么在意呢?非常感谢你对基准的回答。根据您的基准测试,看起来选项C是最快的,而A是最慢的,尽管我不明白为什么。A是最慢的,因为您使用的类方法返回的值超出了其内部范围,C比B快,因为它返回一个刚动态声明的值比从类的构造函数返回值要快?你确定这是一个正式的基准吗?@StephenDuffy非常感谢你对基准的回答。根据您的基准测试,看起来选项C是最快的,而A是最慢的,尽管我不明白为什么。A是最慢的,因为您使用的类方法返回的值超出了其内部范围,C比B快,因为它返回一个刚动态声明的值比从类的构造函数返回值要快?你确定这是一个正式的基准吗?@StephenDuffy