【问题标题】:Programmatically setting the name of a variable以编程方式设置变量的名称
【发布时间】:2011-12-15 19:02:00
【问题描述】:

有没有写以下100个作业的捷径?

variable_1 = 1;
variable_2 = 2;
variable_3 = 3;

...

variable_100 = 100;

我试过了

for(var i = 1; i <= 100; i++) {
    variable_ + i = i;
}

但我收到错误消息“分配中的左侧无效”。有什么想法吗?

【问题讨论】:

标签: javascript


【解决方案1】:

这里有几个方法:

方法一:使用eval

这里是最直接的方法:

for(var i = 1; i <= 100; i++) {
  eval("var variable_" + i + " = " + i);
}
variable_1; // => 1

上述方法的免责声明:我认为这个问题不适合使用eval。如果您确实使用eval,则绝不应让用户输入进入您的evaling,否则您可能会打开您的网站面临安全风险。这个错误是人们说eval 是邪恶的主要原因。

方法二:使用动态生成的对象属性

这是一个非常非常更好的方法:

// If you want these variables to be global, then use `window` (if you're 
// in a browser) instead of your own object.
var obj = {};
for(var i = 1; i <= 100; i++) {
  obj["variable_" + i] = i;
}
obj.variable_1; // => 1

关于评论中关于使用窗口创建全局变量的注释:我建议不要这样做,因为它是一种快速污染全局范围并在不知不觉中踩到变量的方法。

方法三:使用数组

David 建议使用数组。这是另一个好主意,并且根据您的尝试,可能是首选:

var arr = [];
for(var i = 1; i <= 100; i++) {
  arr.push(i);
}
arr[0]; // => 1

【讨论】:

    【解决方案2】:

    这样就可以了:

    for(var i = 1; i <= 100; i++) {
        eval("variable_" + i + " = " + i + ";");
    }
    

    eval 基本上是邪恶的,但为此目的使用它是可以的。 (reference)

    Live test case.

    【讨论】:

    • 请注意eval 本身并不邪恶。滥用eval 是邪恶的。 eval 在某些情况下实际上是一个强大的工具(尽管这不是必需的,IMO)。看我的回答。
    • @benekastah 我同意,但看起来大多数 JavaScript 世界级专业人士完全反对eval - 可能是因为滥用它的风险大于收益。至于更好的选择,我也同意,但看不出有 100 个变量有什么害处,所以没有反对它的建议。
    • 我会说 99.99% 的案例说变量是全局的,所以 window['variable_'+n] 可以正常工作
    • @ShadowWizard:我可以看到有 100 个变量是有害的。计算机科学中唯一允许的数字是 0、1 和 n+1。如果你想存储 100 个你真的应该使用数组的东西。
    • 您正在循环中重新调用解释器。性能方面,这很糟糕:jsperf.com/eval-vs-array
    【解决方案3】:

    最好使用数组

    var variable = [];
    for (var i=1; i <= 100; i++) {
      variable[i] = i;
    }
    

    稍后,您可以使用变量[1]、变量[2]等访问这些值。

    【讨论】:

      【解决方案4】:

      如果是这样,为什么不定义对象数组

      var a = new Array();
      for(i=0;i<100;i+=)
       a[i] = i;
      

      【讨论】:

      • 不要使用new Array()。它的邪恶
      • @missingno - 好的,谢谢你的信息......它只是为了指出你可以更好地选择数组而不是那个 eval 方法
      • 别担心,我知道 eval 更邪恶
      【解决方案5】:

      为什么不使用这样的数组呢?

      <script language="javascript">
      var arrayVar = new Array();
      
      for (var i=0; i<100; i++) {
          arrayVar["variable_" + i] = i;
      }
      </script>
      

      【讨论】:

      • 不要使用new Array()它的邪恶
      • 感谢@missingno 的建议,下次我将使用新的missingno() 代替
      • 使用 new missingno() 将清除您的 Indigo League 名人堂记录。普通的[] 错误较少。
      【解决方案6】:

      使用数组:

      var variable = [];
      
      for(var i = 1; i <= 100; i++) {
          variable[i] = i;
      }
      

      打个比方,出于同样的原因,您希望使用数组而不是 100 个变量

      <div class="variable"></div>
      <div class="variable"></div>
      <div class="variable"></div>
      //and so on
      

      而不是

      <div id="variable_1"></div>
      <div id="variable_2"></div>
      <div id="variable_3"></div>
      //and so on
      <div id="variable_100"></div>
      

      Invalid left-hand side in assignment
      

      生成此错误是因为variable_ + i 是一个表达式。解释器认为您正在尝试添加两个变量,而不是连接变量名和字符串。表达式不能位于赋值操作的左侧。

      【讨论】:

        【解决方案7】:
        for(var i = 1; i <= 100; i++) {
            window["variable_" + i] = i;
        }
        
        alert( variable_50 );
        
        alert( variable_34 );
        

        【讨论】:

          【解决方案8】:

          假设您使用的是浏览器,您可以这样做:

          global[variable] = 'hello'

          console.log(variable) -> hello

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-09-14
            • 1970-01-01
            • 1970-01-01
            • 2012-06-28
            • 2015-07-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多