是否值得优化用常量替换字符串的Javascript代码?

时间:2012-05-04 10:16:40

标签: javascript string performance optimization

我经常使用jquery,有时候我的代码包含很多重复的css类名,比如:

$('#div1').addClass('funny-class');
...
$('#div2').addClass('funny-class');
...
$('#div1').removeClass('funny-class');

等...我问自己是否值得使用伪常量来清理代码,如:

var constants = {
    FUNNY: 'funny-class'
}
...
$('#div1').addClass(cnst.FUNNY);
$('#div2').addClass(cnst.FUNNY);
$('#div1').removeClass(cnst.FUNNY);

第一:最小化。如果“常量”是局部变量(隐藏在范围内),则最小化器可能会将“constants.FUNNY”的出现替换为像“a.B”这样最小化的东西。

第二:速度。带有“常量”的代码比第一个快?

您怎么看?

4 个答案:

答案 0 :(得分:2)

您可以使用Google的closure compiler进行高级优化,以识别常用的重复字符串,并将其替换为常量变量引用。但这种优化是微不足道的;如果你想改进你的代码,你可以通过缓存jQuery对象得到更好的改进(这是许多程序员经常忽略的事情):

var $div1 = $('#div1');
var $div2 = $('#div2');
$div1.addClass('funny-class');
$div2.addClass('funny-class');
$div1.removeClass('funny-class');

答案 1 :(得分:1)

它可能不会像性能一样明显,但使用常量而不是字符串总是一个好习惯,因为您可以通过更改常量的值来轻松修改值。

答案 2 :(得分:1)

  1. 是的,缩小器可能会减少constants.FUNNY变量,因为它可能不会检测到'funny-class'的重复使用并分配它变量。

  2. 速度差异很小,你不应该在乎。一方面你必须解决范围链中的变量(非常快),但另一方面你必须创建一个String原语(也很快)。

  3. 拥有constants对象的好处是,如果您决定更改所分配的课程的名称,则只需在一个地方而不是3个地方进行;这是您应该考虑的唯一好处...而不是0.0000000000000001秒速差。

答案 3 :(得分:0)

将它放在变量中可以为您提供一定量的“中央控制”而不是性能。

但是,将它们深深地放在物体中会导致性能下降。尽可能将它们靠近表面,以避免范围分辨率的开销。 (这是最小的,但仍然是开销)

//this one is so deep:
constants.foo.bar.baz.bam

//this is just 1 level deep:
constants.bam

另外,我更担心你正在制作的jQuery调用

//two calls to #div1!
$('#div1').addClass(cnst.FUNNY);       //$() for div1
$('#div2').addClass(cnst.FUNNY);
$('#div1').removeClass(cnst.FUNNY);    //another $() for div1

//do this instead
var div1 = $('#div1')             //reference div1 once in a local variable

div1.addClass(cnst.FUNNY);        //use the reference to the object
$('#div2').addClass(cnst.FUNNY);
div1.removeClass(cnst.FUNNY);     //use the same reference to the object