JS对象键值的隐性转换
今天在求一种类似[{string:bool},{string:bool}]的数组长度时, 直接用Array.length没有用。
在外网上看到有解释,希望能对大家有用
问题是这样的
在往这个数组添加新元素的时候,我用的是 list[‘string’] = bool, 而不是 list.push({‘string’:bool})
1 | //上图的结果分别是这些东西 我们可以看到 这个object array 虽然看着里面有对象 但是长度却是0 |
我们把问题复现:
分别尝试以取键赋值 和 数组push的方法分别实现 一个字典包对象
我们能看到 这两种方法不只是长度不一样 结果也是不一样的
1 | var a = [] |
可能这个例子不够清晰:再举一个 让大家明白JS作为弱语言发生的隐性转换
1 | var a = [] |
JS会隐性地在读取对象地时候将对象地字符串 键 转换为js理解的类型
所以说
1 | a['1'] 实际上等价于 a[1] |
所以说以 1 为键时 即时取得时候是字符串形式,JS也会自动补全a[0]为empty
所以说也能解释如果是a【‘a’】的形式
1 | var a = [] |
外网的解释是
JS将’a’隐性转换成了对象a,所以只是给a的a属性添加了值,而并没有增加数组的实际长度
如果想遍历这个含有对象地数组 或者看里面的长度 最好还是用类数组的遍历方法
1 | Object.keys(a) //或者 |
英文好的可以看看https://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects