2012-03-14 99 views
3

那么为什么myarray [bla] [bl]总是等于NaN?如果我用1维(myarray [bla])做同样的事情,我会得到这个数字。数组返回NaN

var bla = 'blabla'; 
var bl = 'bla'; 
var myarray = []; 
for (i = 0; i < 10; i++) { 
    if (!myarray[bla]) { 
     myarray[bla] = []; 
    } 
    myarray[bla][bl] += i; 
    console.log(myarray[bla][bl] + " + " + i); 
}​ 
+0

因为myarray [bla] [bl]没有设置... – scibuff 2012-03-14 20:32:59

+0

'undefined + 0'是'NaN'。 – pimvdb 2012-03-14 20:33:28

回答

3

好吧,让我们逐步完成循环,替换变量的实例与'blabla'字符串值:

if (!myarray['blabla']) { 
    myarray['blabla'] = []; 
} 

阵列以JavaScript是由整数值索引。你在这里的代码是将一个expando属性添加到名为blabla的数组实例。那就是:

myarray.blabla = []; 

现在重新考虑你的增量声明:

myarray['blabla'][bl] += i; 

,或者与expando属性:

myarray.blabla.bl // remember that "myarray.blabla" is set to the empty array above 

什么,这是试图做的是访问名为bl的财产空阵列。这就是为什么你在这里得到undefined

无论如何,作为一种最佳实践,您可能希望避免在像JavaScript这样的JavaScript中使用数组,因为像这样的问题必须在足够的时间后出现。

+0

JavaScript中的哈希表的最佳实践是JSON我猜?我来自perl背景,所有你需要知道的都是哈希。 – David 2012-03-14 20:45:09

+1

+1精彩和非常好的解释 – fguillen 2012-03-14 20:47:01

+0

@David - 种 - 实际上JSON对象和JavaScript对象之间有区别,详细在这里比我所能做的更好:http://stackoverflow.com/questions/6489783/ - 但在一般来说,是的,你有时可以使用简单的对象实例作为哈希表。这个*不会工作的一个值得注意的例外是你的散列表键类型不是一个简单的字符串,而是一个自定义对象类型。这个页面有一些很好的解释,为什么对象/数组的行为方式如下:http://www.timdown.co.uk/jshashtable/ – matt 2012-03-14 21:14:50

0

如果扩大一点我希望你能看到的问题,

if (!myarray[bla]) { 
    myarray[bla] = []; 
} 
myarray[bla][bl] = myarray[bla][bl] + i; 

提示:myarray[bla][bl] = undefined

0

因为myarray[bla][bl]未设置...,你需要

if (!myarray[bla][bl]){ myarray[bla][bl] = 0; }