JS中Array的非合法数值索引

为啥写这篇博客呢,因为今天做笔试的时候,有一道题涉及到了我的知识盲区,所以丢了4分,哭瞎。闲话不多说,进入正题。

一、举个例子

这次不先讲原理什么的了,先上我笔试遇到的题,大家看看输出会是啥?

var a = [];
var b = {key: 'b'};
var c = {key: 'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);

当当当当,输出是456,是不是很奇怪?记住一句话“JS里面一切都是对象”,然后看下去你就懂了。

二、Array下标索引的合理值

在JS中,Array的下标索引数值是有一个范围的,就是0~2^32(2的32次方),如果索引超出这个范围或者根本就不是数值,JS会将它转换成字符串,并将这个字符串作为Array对象的一个属性,这个索引对应的值是Array对象的属性值,而不是数组元素值,而且这些操作不会改变数组应有的特性。

这句话就解释了为什么出输出有点“奇怪”。在上面的例子变量b是一个对象,当它作为数组a的下标索引时,不在合理值范围内,所以它会被转换成字符串,即调用对象的toString()方法,转换成[object Object],同时变成了a数组对象的一个属性,它的属性值是123,然后变量c也是一个对象,不在合理值范围内,所以也被转成了[object Object],然后属性值就被更新成了456,最后输出的时候同样的原因,所以输出是456。

JS中Array的非合法数值索引_第1张图片

三、延伸拓展

看输出信息,大家应该会发现数组a的长度为0,这说明数组内并没有元素,所以也符合前面说的,只是给数组对象添加了一个属性,而没有改变数组应有的特性。

关键来啦,如果下标本身是字符串且是合理值范围的数值字符串时,比如“1”,那么情况又不一样了,JS会将其先转成数值,然后在对应的数值索引的位置添加元素。就像下面的例子,在数组1的位置添加了789这个元素,同时长度变成了2,这些都符合数组的特性。

JS中Array的非合法数值索引_第2张图片

如果无法转换成数值,那么也是转成数组对象的属性,就像下面的例子。

JS中Array的非合法数值索引_第3张图片

在举一个超出合理值范围的数值的例子,比如-1的时候,也会被转成字符串,然后当做数组对象的属性。

JS中Array的非合法数值索引_第4张图片

四、总结

 知识盲区还是挺多的,特别JS作为弱类型语言,存在不少隐式类型转换的情况,一个不小心,可能就会中招,所以平时还是要多多积累。谨记“JS里面一切都是对象”吧。

还有关于隐式类型转换,感兴趣的话可以看看我的另一篇博客《JS极易忽视的“美”——精度丢失和隐式类型转换》,里面讲了一些隐式类型转换的问题。

才疏学浅,可能会有纰漏,希望大家能指出来。

你可能感兴趣的:(JavaScript)