【问题标题】:Auto-enumeration in JavascriptJavascript 中的自动枚举
【发布时间】:2011-03-10 21:20:28
【问题描述】:

我想创建 C 类型的枚举,值自动从 0 开始。
下面的代码有什么问题?

function ArrayToEnum(arr)
{
    var len = arr.lenght;
    en = {};
    for(i=0;i<len;i++)
        en[arr[i]]=i;
    return en;
}

a=['foo','bar'];
b=ArrayToEnum(arr);
console.debug(b.foo);

> Undefined

我希望它打印 0 但相反(至少在 Chromium 9.0 中)这是未定义的。如果我不调用函数,而是直接应用主体,它可以工作:

var l=a.length;
for(i=0;i<l;i++) b[a[i]]=i;
console.debug(b.foo);

> 0

函数有什么问题?

【问题讨论】:

  • 您在代码的第 3 行拼错了 length。您的实际代码中是否也存在该错误?还有——这有什么意义?

标签: javascript object enums


【解决方案1】:

如果那是您的实际代码,“长度”在第三行中被拼写为“长度”:

 var len = arr.lenght;

我希望它可以编译,但它会将len 设置为等于undefined,这将完全阻止您的循环体执行。这将导致 arr.foo 又名 arr["foo"] 成为 undefined,正如您在输出中看到的那样。

当上一行中的数组被称为a,而不是arr 时,您还将"arr" 传递给ArrayToEnum()。

这里的共同主题是,当您开始谈论尚未定义的变量时。 JavaScript “有用”地定义了它,而不是告诉你它还不存在。

我在 Chrome JS 控制台中尝试过,但在修复“a”/“arr”问题之前出现“引用错误”。一旦解决了这个问题,我就得到了你所描述的“未定义”。

当我修复“长度”时,宾果游戏会打印“0”。

【讨论】:

  • "a"/"arr" 是复制/粘贴错误,在源代码中是正确的,但该死的我拼错了长度。谢谢。
猜你喜欢
  • 2011-03-22
  • 2017-11-10
  • 2012-01-28
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2016-12-11
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多