关于数组字符串下标问题

哇咔咔,今天做了金山WPS的笔试题,到了现场懵逼了,好熟的一道题,但是写错了。

var arr=[];
    arr['a']=1;
    console.log(arr.length);//0
    console.log(arr);
    arr['2']=2;
    console.log(arr.length);//3
    arr.length=0;
    console.log(arr);

给arr添加下标为‘a’的属性,但是他不改变数组原来的长度。
然后我就试着输出了第一次添加属性的时候arr是什么:
这里写图片描述

竟然是0。。
然后我分别用for of和for in遍历了一下数组。

var arr=[];
    arr['a']=1;
    console.log(arr.length);
    console.log(arr);
    for(var i of arr){
        console.log(i);
    }//没有输出
    for(var i in arr){
        console.log(i,arr[i]);
    }//输出a 1

不出意料:用for of是没有输出,for in输出a 1
由于for of是遍历数组的最优选择,它遍历的是数组的元素值,且他不会去遍历原型上的东西。
而for in 不一样啊,它最多的用去遍历对象。
所以说,我们这个数组继承了Object的属性,可以给他添加属性啦~~~
但是又有个问题了;
为啥

arr['2']=2;

之后输出却有长度了。
呃呃呃,这个我看到别人写的是:
Javascript数组下标值的范围为0到2的32次方。对于任意给定的数字下标值,如果不在此范围内,js会将它转换为一个字符串,并将该下标对应的值作为该数组对象的一个属性值而不是数组元素,如果该下标值在合法范围内,则无论该下标值是数字还是数字字符串,都一律会被转化为数字使用,即 array[“100”] = 0 和 array[100] = 0 执行的是相同的操作。
所以说,他的下标都会被转换成数字。
这就很好了。
这就说明了他的长度是3 没毛病。
前面就是一一解释,代码不太完整,
完整代码:

 var arr=[];
    arr['a']=1;
    console.log(arr.length);
    console.log(arr);
    for(var i of arr){
        console.log(i);
    }//没有输出
    for(var i in arr){
        console.log(i,arr[i]);
    }
    arr['2']=2;
    console.log(arr.length);
    arr.length=0;
    console.log(arr);

这里写图片描述

嘻嘻嘻~~~就是这些,等在深入之后在继续写。。


版权声明:本文为weixin_40197429原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。