6

选项1:多个无赋值的var

function MyFunction() {

  var a = null;
  var b = null;
  ....
  var z = null;

  a = SomeValue;
  b = SomeValue2;
  ....
}

选项 2:一个 var 语句,无赋值

function MyFunction() {

  var a, b ..., z;

  a = SomeValue;
  b = SomeValue2;
  ....
}

选项 3:带赋值的多个 var 语句

function MyFunction() {

  var a = SomeValue;
  var b = SomeValue2;
  ....
  var z = SomeValue26;
}

使用特定选项是否有任何性能优势?AND两个原始类型赋值对象引用赋值都是真的吗?

感谢您的输入。

4

7 回答 7

17

“过早优化是万恶之源”

我认为这些选项中的任何一个都不会有任何显着的性能变化。
(IMO)第三个选项是最易读的选项,最接近动态内存分配,如C#etc'。但这是我的拙见,选择你最喜欢的。

如果它真的让您感到困扰并且您无法在没有答案的情况下入睡,请使用jsPerf对其进行测试。


@Chad 做了一个jsPerf,所以你今晚可以睡个好觉......

于 2012-03-12T18:26:38.487 回答
6

要了解性能,您首先应该了解吊装。让我们看下面的代码:

var x = 1;

function bar(val) {
    var returnVal = val * 2;

    return returnVal;
}

function foo(val) {
    var returnVal = 10;

    returnVal *= bar(val);

    return returnVal;
}

var y = foo(x);

console.log(y); // 20

提升基本上意味着 JavaScript 解释器会将变量声明“提升”到其范围的顶部。让这个例子看起来更像这样:

var x, y;

x = 1;

function bar(val) {
    var returnVal;

    returnVal = val * 2;

    return returnVal;
}

function foo(val) {
    var returnVal;

    returnVal = 10;
    returnVal *= bar(val);

    return returnVal;
}

y = foo(x);

console.log(y); // 20

因此,在您给出的示例中,选项 2 和 3 基本上会做同样的事情。因为解释器会将这些声明移到顶部。在这一点上,这是一个偏好的决定。很多人避免做一些事情,比如说var x, y, z;它很危险。我个人是这样做的。在我所处的任何范围内,我都会在顶部声明所有变量,然后在下面使用它们。但无论哪种方式都有效。

现在,您的第一个示例效率最低。吊装后是这样的:

function MyFunction() {
    var a, b, ... z;

    a = null;
    b = null;
    ...
    z = null;

    a = someValue;
    b = someValue2;
    ...
    z = someValueN;
}

它基本上导致两次设置变量。

于 2012-03-12T18:45:57.467 回答
1

在 Chrome 中,执行时间是相同的

这里唯一真正需要考虑的是优化网络传输

考虑var a=1;var b=2;...;var z=9;var a=1,b=2,...,z=9;

如果您;var 在每个标识符前面放置 a ,则为 5 个字节(假设为单字节字符编码),而 a 为 1 个字节,。因此,声明 26 个变量,您可以通过编写var 一次并用逗号列出标识符来节省 100 个字节。

诚然,这并不是一笔巨大的节省,但在通过网络推送比特时,每个字节都有帮助。这没什么好担心的,但是如果您发现自己在同一区域中声明了多个变量,那么使用变量声明列表是一种从 JS 文件中减少几个字节的简单方法。

于 2012-03-12T18:47:04.650 回答
0

这似乎是过早的优化,万恶之源。

会执行多少次?这将消耗整个程序的哪一部分?

于 2012-03-12T18:27:03.980 回答
0

我会用几个问题来反驳你关于性能的问题:

  1. 您是否注意到性能问题?
  2. 您是否确定您的 var 语句是瓶颈?
  3. 你测试过每个版本吗?

我将假设所有这些的答案是否定的。

尽管唯一确定的方法是运行它们并进行测试,但这些选项都不会产生任何显着差异。JavaScript 作为一种异步客户端语言意味着您必须运行大量代码才能使var语句成为任何类型的瓶颈。


最后,如果您决定使用哪个版本,我建议使用var没有赋值的单个语句:

function () {
    var a,
        b,
        c,
        foo,
        bar,
        fizz,
        buzz;
    a = 1;
    ...
    b = 3;
}

原因是这本质上是由于变量提升而执行代码的方式。然后我可以移动初始化语句,以便首先使用变量,例如在for循环中:

function foo(arr) {
    var i,
        l;
    ...
    for (i = 0, l = arr.length; i < l; i++) {
        doStuff(arr[i]);
    }
    ...
}
于 2012-03-12T18:29:00.820 回答
0

它们基本上都做同样的事情:声明一个变量并最终定义它(给它赋值)。您在整个示例中唯一要更改的是发生的顺序,甚至这取决于正在编译您的 JavaScript 的浏览器——有些可能会执行其他人不会执行的优化。

不过,您应该遵循一些风格准则,这个答案很好地解释了它们。请记住,该答案与技术无关,可能根本不适用于 JavaScript。

于 2012-03-12T18:30:26.940 回答
0

如果可能,请远离选项 1,无需进行两次分配。

甚至在 for 循环或其他复合语句/块中声明的变量也将在其包含块之外可用。

你也可以这样做:

function MyFunction() {

  var a = SomeValue, b = SomeVavlue2;

}
于 2012-03-12T18:43:53.043 回答