为什么数组中的字符串索引不会增加'长度'
Why does a string index in an array not increase the 'length'?
在下面的例子中,array2.length
只是10
,而在我看来,它应该是13
。
为什么"字符串键控"索引不会增加数组的length
?
我可以存储东西,但仍然可以访问它,VS调试器显示这些数组存储正确。那么为什么length
没有增加呢?
var array2 = new Array();
array2["a"] = new Array();
array2["b"] = new Array();
array2["c"] = new Array();
for (var i = 0; i < 10; ++i)
array2[i] = new Array();
var nothing = "";
for (var i = 0; i < array2.length; ++i)
nothing = "";
Javascript数组不能有"字符串索引"。Javascript Array
完全以数字方式编制索引。当您设置"字符串索引"时,您正在设置对象的属性。这些是等效的:
array.a = 'foo';
array['a'] = 'foo';
这些属性不是阵列"数据存储"的一部分。
如果你想要"关联数组",你需要使用一个对象:
var obj = {};
obj['a'] = 'foo';
也许最简单的可视化是使用文字符号而不是new Array
:
// numerically indexed Array
var array = ['foo', 'bar', 'baz'];
// associative Object
var dict = { foo : 42, bar : 'baz' };
因为长度被定义为一加上数组中最大的数字索引。
var xs = [];
xs[10] = 17;
console.log( xs.length ); //11
出于这个原因,您应该只使用数组来存储按数字索引的内容,如果您想使用字符串作为键,则应使用普通对象。此外,作为一个附带说明,使用像[]
或{}
这样的文字来代替new Array
和new Object
是更好的做法。
您没有向数组中添加项;您正在向Array
对象添加属性。
如上所述,将object用于关联数组。
如果你不这样做,你不一定会注意到你做错了,直到你无辜地使用"长度"作为数组索引:
var myArray = [];
myArray["foo"] = "bar"; //works
console.log(myArray["foo"]) //print "bar"
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length"
这是因为将数组的length
属性替换为无效的String。
"字符串键控"索引根本不是索引,而是属性。CCD_ 14与CCD_。请记住,您可以在javascript中设置任何类型的变量的属性,这正是您在这里所做的。
您可以将对象推送到数组,它将自动获得索引(整数)。如果您想按需添加索引,则需要将其作为对象
如果您想像使用字符串索引数组的实例一样使用对象的属性,那么长度的解决方法是:
var myArray = new Array();
myArray["a"] = 'foo';
myArray["b"] = 'bar';
myArray["c"] = 'baz';
let theLength = Object.keys(myArray).length
相关文章:
- JQuery使计数器每次更改时都会增加
- 创建具有可变长度幻灯片显示的幻灯片
- 使用D3.js计算带有字母间距的文本长度
- 如何增加同时按键总数
- 如何使用css动画从中心增加边界线
- 使用javascript在MVC中查找网格长度时出错
- 如何制作侧边栏以增加其完整长度
- 为什么我的数组长度没有增加
- 文本区域中的新行字符会增加 C# 中的文本长度
- 数组长度不随 .push() 增加
- Js 数组长度增加得太早
- 为什么数组中的字符串索引不会增加'长度'
- 如何在fluxiblefetcher应用程序中增加ajax请求超时长度
- JSON.stringify会增加字符串的长度吗
- 增加mailto:的IE URL长度限制
- 根据屏幕大小调整(增加/减少)字符串长度
- 如何增加画布长度
- 如何在每次数组长度增加时动态地向页面添加新内容?
- 如何在文本区域的文本长度大于52时增加其行数?
- 当通过AJAX传递给PHP时,传递多维数组会增加其长度