为什么javascript为具有object属性而不是indexed元素的数组显示0长度

时间:2016-01-08 13:38:28

标签: javascript

例如:

ipython notebook

在上面的代码示例中,var arr = []; arr[3.4] = 1; console.log(arr.length); 属性为零,为什么以及JS解析器内部发生了什么,因为它的长度为零。

4 个答案:

答案 0 :(得分:9)

数组的length反映了数组中存在的最大数组索引。 “数组索引”(见下文)是一个属性名称,它是一个小于2 32 -1的整数值。由于3.4不是整数,因此设置它不会改变length

数组是对象,因此数组没有理由不能拥有名为3.4的属性,但该属性不会影响length,因为它的名称不符合标准数组索引。

ES2015 9.4.2, Array Exotic Objects将“数组索引”定义为小于2的整数 32 -1:

  

属性名称​​ P (以String值的形式)是数组索引当且仅当ToString(ToXint32( P ) ))等于P和ToUint32( P )不等于2 32 -1。“

该定义用于length值(强调我的):

  

每个Array对象都有一个length属性,其值始终是小于2 32 的非负整数。 length属性的值在数值上大于名称为数组索引 的每个属性的名称;无论何时创建或更改Array对象的自有属性,都会根据需要调整其他属性以保持此不变量。具体来说,每当添加名称为数组索引的自有属性时,length属性的值将更改,如果需要,将比该数组索引的数值多一个...

答案 1 :(得分:2)

JavaScript数组不能包含小数索引。

你在那里做了什么在数组对象上分配了一个名为"3.4"的属性。

这不会影响length属性,该属性旨在返回一个高于最高有效索引的数字。

如果你考虑数组应该如何工作,你应该意识到分数偏移是没有意义的。

答案 2 :(得分:1)

您可以尝试使用对象与数组。

var arr = {};
arr[3.4] = 1;
arr[3.5] = 2;
arr[3.6] = 3;
console.log(Object.keys(arr).length);

答案 3 :(得分:0)

您必须使用整数作为索引,而不是浮点数。

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char* name; }student; int main() { int size; printf("enter number of entries\n"); scanf("%d" , &size); student* all=malloc(size*sizeof(student)); int i; for(i=0;i<size;i++) { printf("enter name\n"); scanf("%s" , all[i].name); } return 0; }