为什么js的"关联数组"不能转成json字符串而对象可以?【转】
2023-09-27 14:25:31 时间
定义这么一个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
相关文章
- [转] js日期对象Date对象方法 时间方法
- js,jq获取checkbox复选框被选中的值,生成数组array,生成对象object,兼容IE
- 【Vue/js】通过localStorage浏览器实现变量和对象的本地缓存(图文+完整源代码)
- eval()函数是做什么的?或者说如何将字符串解析成js对象并运行??
- js 数组循环删除元素或对象
- uniapp - 实现动态且 “可重复“ 开启与关闭动画,由 JS 点击 / 长按等事件控制开启 “某个元素“ 的 CSS 动画(类似常见的点赞动画效果可以一直重复触发动画)兼容 H5 App 小程序
- javascript实现java的map对象,js实现new map()
- js为什么返回两个对象字符串 objcet objcet ?
- js sort方法根据数组中对象的某一个属性值进行排序
- JS——内置对象Date()篇
- js判断数组参数是否全部相等,或对象数组相同的key参数是否相等
- js下载
- js数据结构与算法:链表
- 关于js函数,方法,对象实例的一些说明
- js实现存储对象的数据结构hashTable和list
- Vue---this.$route和this.$router这两个对象--都需要在router.js 中配置
- js给对象添加属性
- Three.js教程之在网页快速实现 3D效果(教程含源码)
- JS快速将对象中所有键赋值为空
- Vue.js中this.$nextTick()的使用
- JS 将数字字符串数组转为 数字数组 (互换),js获取数组对象中 某一个key的值,js判断一个数组是否包含另一个数组(一维数组)
- js面向对象:对象创建/继承的演化过程
- [js高手之路]使用原型对象(prototype)需要注意的地方
- [js高手之路] es6系列教程 - 函数的默认参数详解
- 原生JS实现new方法、new一个对象发生的四部、new里面常用的优先级
- js对象数组按照多个字段进行排序
- js中的问题(this)(遍历对象中的属性)
- 【web前端(三十一)】javascript_BOM模型(浏览器对象模型)、js脚本写法
- js 的each()方法遍历对象和数组
- 前端 js判断json对象中是否含有某个属性