在使用自定义键推入一些值之后,Javascript数组似乎是空的

我遇到了一个奇怪的问题,即使我将某些内容推送到具有自定义索引键的数组,它仍然显示为空数组。 如果我知道索引,那么我可以达到内容。

function search (source, pattern) { let regexp = new RegExp(pattern, 'g'); let messages = []; let match; while ((match = regexp.exec(source)) !== null) { let date = match[2]; let ms = parseDate(date).getTime(); if(Object.prototype.toString.call(messages[ms]) !== '[object Array]') messages[ms] = []; messages[ms].push(match[0]) } console.log(messages); console.log(messages[1414860420000]); } 

用我的模式在我的源代码中调用这个函数会缠绕多个匹配,并将它们推送到主数组中正确的子数组中。 但如果在此之后,我尝试console.log(messages); 它将返回[ ]而不是[object Array]的列表。 然而,调用一个现有的密钥,我可以达到messages数组内的数据。 我错过了什么? 为什么数组中的内容“不可见”?

编辑:

为什么作为一个属性附加的值而不是数组成员的确切原因是因为我想使用的数字大于最大允许的大小

所以,虽然这工作:

 var fruits = ['apple', 'banana', 'kiwi']; fruits[23] = 'pear'; document.getElementsByTagName('p')[0].innerHTML = fruits.toString(); 
 <p></p> 

这不会工作:

 var fruits = ['apple', 'banana', 'kiwi']; fruits[53454657567573] = 'pear'; document.getElementsByTagName('p')[0].innerHTML = fruits.toString(); 
 <p></p> 

更改let messages = []; let messages = {}; 您没有将messages用作数组。 您正在使用它作为存储属性/值的对象。 虽然数组也是一个对象,所以属性确实存储在数组中,但是当您使用数组而非普通对象时, console.log()会被愚弄。

console.log()认为你想查看数组的内容。 但是messages中没有实际的数组元素。 你会看到messages.length === 0 。 数组实际上是空的,这是console.log(messages)显示给你的。

另一方面,如果你使消息成为一个普通的对象,那么console.log()将显示对象上的属性/值对。


仅供参考,这不会改变行为,但你可以通过改变这个简化:

 if(Object.prototype.toString.call(messages[ms]) !== '[object Array]') 

对此:

 if (!messages[ms]) 

因为你正在试图看到的是该属性是否曾经被初始化为一个数组。