关于JS对象键值隐性转换导致的复合数组求长度出现的问题

JS对象键值的隐性转换

今天在求一种类似[{string:bool},{string:bool}]的数组长度时, 直接用Array.length没有用。

在外网上看到有解释,希望能对大家有用

问题是这样的

在往这个数组添加新元素的时候,我用的是 list[‘string’] = bool, 而不是 list.push({‘string’:bool})

在这里插入图片描述

//上图的结果分别是这些东西  我们可以看到 这个object array 虽然看着里面有对象  但是长度却是0
console.log(array,array.length,Object.prototype.apply(array))

我们把问题复现:
分别尝试以取键赋值 和 数组push的方法分别实现 一个字典包对象
我们能看到 这两种方法不只是长度不一样 结果也是不一样的

var a = []
a['a'] = 1
a['b'] = 2

var b = []
b.push({'a':1})
b.push({'b':2})

console.log(a.length, b.length); //0, 2
console.log(a,b); //[ a: 1, b: 2 ], [ { a: 1 }, { b: 2 } ]

可能这个例子不够清晰:再举一个 让大家明白JS作为弱语言发生的隐性转换

var a = []
a['1'] = 1
a['2'] = 2

var b = []
b.push({'1':1})
b.push({'2':2})

console.log(a.length, b.length); // 3 2
console.log(a,b); // [ <1 empty item>, 1, 2 ] [ { '1': 1 }, { '2': 2 } ]

JS会隐性地在读取对象地时候将对象地字符串 键 转换为js理解的类型

所以说

a['1'] 实际上等价于 a[1]

所以说以 1 为键时 即时取得时候是字符串形式,JS也会自动补全a[0]为empty

所以说也能解释如果是a【‘a’】的形式

var a = []
a['a'] = 1
a['b'] = 2

外网的解释是

JS将’a’隐性转换成了对象a,所以只是给a的a属性添加了值,而并没有增加数组的实际长度

如果想遍历这个含有对象地数组 或者看里面的长度 最好还是用类数组的遍历方法

Object.keys(a) //或者
Object.entries(a) //不是很好用 因为如果数组是对象 会出现每个索引为键  而值才是你要的每个字典 所以要再进行一次遍历
//推荐用keys 再从数组中取

英文好的可以看看https://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值