数组长度返回0。

19

有人能帮忙解释一下为什么长度返回为0吗?非常感谢您的帮助!

var errors = [];
errors[''] = "Monday Morning slot already taken. Would you like to replace it?";
console.log(errors);
document.write(errors.length);

1
因为空字符串不是数值索引。 - elclanrs
5个回答

37

只有数字索引会影响数组的.length属性。

其他命名属性是允许的,但它们不是 Array 对象的典型用法。通过使用 "",您可以在对象上创建一个非数字属性。 您可以像这样访问它:

errors[""];

但是你无法使用典型的Array方法来访问它。


对于具有名称的属性,通常会使用对象。无论哪种方式,您都可以使用Object.keys()获取自身可枚举属性(包括数值索引)的数量。

Object.keys(errors).length;

@ Derek 朕会功夫:空字符串?是的,奇怪的是,那是一个有效的名称。 :-) - cookie monster
这应该是被接受的答案,@Derek朕會功夫的答案解决了问题的一半(一维数组),考虑以下示例:error['A']='message A',errors['B']='message B'...使用push解决方案,您将无法再按键查找。 - 0xFK

12

因为这不是向数组添加项的正确方式,因为数组只接受数字键。你应该像这样添加:

errors.push("blah");  /*or*/  errors[0] = "blah";

//Now if you check the length:
errors.length;  //1

另外,如果您将其用作对象,则''也不是有效名称。

*更正:看起来您可以使用""(空字符串)作为键。


1
请编辑答案以指出,虽然您可以通过这种方式添加项目,但这不会影响长度属性。说只能接受数字键是不正确的。 - Va5ili5

6
由于您使用了字符串键而不是整数键,JavaScript 将把您的数组视为存储键/值对的对象。如@cookiemonster所提到的那样,您可以使用Object.keys(errors).length获取长度。此外,您可以考虑使用JavaScript ES6 Map
var errormap = new Map();
errormap.set('err101', 'Description for error 101');
errormap.set('err102', 'Description for error 102');

根据错误代码获取错误描述:
console.log(errormap.get('err101'));

你可以通过简单地编写以下代码获取 Map 对象的长度:

console.log(errormap.size);

2

你的数组需要一个数字输入,而你当前使用的是空字符串作为索引,这是无效的。

你可以指定一个索引、用给定的元素初始化数组,或将该项推入数组中:

// Option 1: Specify index
var errors = [];
errors[0] = 'Monday Morning slot already taken. Would you like to replace it?';

// Options 2: Initialise the Array with values
var errors = ['Monday Morning slot already taken. Would you like to replace it?'];

// Option 3: Push the item to Array
var errors = [];
var myString = 'Monday Morning slot already taken. Would you like to replace it?';
errors.push(myString);

0
任何数组的索引都从零开始,当您尝试获取特定索引处的值或更改特定索引处的值时,您指定整数作为索引,在方括号内始终从零开始。
例如,
让错误 = [] //创建一个空数组的新实例。
//可以用两种方法向数组添加项目。
  1. erros.push(添加任何您喜欢的值)
  2. errors [0] = '添加任何您喜欢的值'
添加项目到数组的这两种方法都会将项目添加到零处。
为了使您的代码工作,请在[]中使用整数而不是字符串。我希望你明白了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接