为什么js的"关联数组"不能转成json字符串而对象可以?【转】

定义这么一个js的“关联数组”:

var arr = new Array();
    arr['school'] = 1;
    arr['team'] = 2;
    console.log(JSON.stringify(arr));

得到的结果:

[]

为什么会这样?实在不知道为什么了,但是通过:

console.log(arr.school);//1

这种方法可以取到值,这样看是存在的,但是好像又不存在,实在搞不懂
用对象的方式就正常转换:

var obj = {
    school: 1,
    team : 2
}
console.log(JSON.stringify(obj));//{"school":1,"team":2}

如果说js不支持这种关联数组的形式但为什么可以取值呢?能取到值但为什么转成json字符串就什么也没有了呢?
一句话,你的 arr 是有两个属性的空数组,数组转字符串当然是展示数组的内容,不会去遍历数组的属性!下面解释:

js不支持这种关联数组的形式但为什么可以取值呢?

因为数组本身也是对象,特殊的对象,

var arr = new Array();
    arr['school'] = 1;
    arr['team'] = 2;

从对象的角度来看,你只是给 arr 对象增加了两个属性,那么你取值,实际上是读取属性,当然是可以取到的的;你给 arr 增加值了么?没有!这个地方,arr 的 length 还是 0 ,也就是说,arr 还是 [] 空数组,那么你用 JSON.stringify() 显示的当然是 []

能取到值但为什么转成json字符串就什么也没有了呢?

能取到值是因为你取的是属性,数组作为对象,当然可以设置读取属性;
转JSON什么都没有,因为 arr 是空数组呀,所以取到的值肯定是 [];

 
引申,其实数组作为特殊的对象,他的 index,本身也是他的属性,计算在length里面,你设置的 school,team 也是属性,不算在length里,通常遍历的时候,都是按照 index 遍历的,属性不遍历,如果你设置 index 的属性,默认就是设置了数组中的项了,比如你上面的代码改下,就是不同的结果:

文章转自:https://segmentfault.com/q/1010000012785820

猜你喜欢

转载自www.cnblogs.com/KillBugMe/p/13162438.html