zoukankan      html  css  js  c++  java
  • 为什么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

  • 相关阅读:
    ThinkPHP—URL的访问以及各种方法的操作
    深入理解line-height与vertical-align——前端布局常用属性
    深入理解display属性——前端布局常用重要属性
    使用JQuery实现图片轮播效果
    新手之首次部署阿里云centos7+mysql+asp.net mvc core应用之需要注意的地方
    NPOI 之导入导出
    Sqlserver 还原
    SQL Server数据库状态和文件状态
    Sqlserver 备份
    单例模式
  • 原文地址:https://www.cnblogs.com/KillBugMe/p/13162438.html
Copyright © 2011-2022 走看看