JS数组添加自定义属性后,console.log与JSON.stringify结果为何不一致?
数组自定义属性在控制台与JSON序列化中的差异解析
先看你给出的代码:
let test = []; test.someProp = "haha"; console.log(test); // 输出: [ someProp: 'haha' ] console.log(JSON.stringify(test)); // 输出: [] console.log(test.someProp); // 输出: haha console.log(JSON.stringify(test)); // 输出: []
原因拆解:
数组是特殊的对象
JavaScript里数组本质是继承自Object的特殊对象,所以支持像普通对象一样添加任意自定义属性。控制台的console.log会完整展示这个对象的所有成员——包括数组的索引元素和你手动添加的自定义属性,因此会显示带someProp的类对象形式。JSON.stringify对数组的序列化规则
JSON规范里的数组仅指按索引排序的有序元素集合,JSON.stringify处理数组时,只会遍历键为非负整数的元素(也就是传统意义上的数组项),直接忽略所有字符串键的自定义属性。因为你的test数组没有任何索引式元素,所以序列化后得到空数组[]。自定义属性并未消失
从console.log(test.someProp)输出haha可以确认,这个自定义属性一直保存在数组对象上,只是JSON.stringify不把它纳入数组的序列化范围而已。
内容的提问来源于stack exchange,提问作者Lenny4
相关产品推荐
相关产品推荐

