JS数组的数字和非数字下标

正在安静的撸码,PHP老公突然Q我,问,“你们JS里数组能用非数字下标吗。”

并没有仔细思考的我,扔给他一句,“不行,闹呢,2的32次方都不够使了么。”

然而,事情并没有如我所料的结束,片刻之后,他滴滴我,说“你个大混子,这是可以的。”然后扔给我一个截图。

JS的Array是可以有非数字下标的,就是有些行为怪异。你说这人非要用PHP什么的东西往JS里套,还来麻烦我,我能怎么办,我也很绝望啊。控制台里看一下吧。

let a=[];
a['aa']='bb'
console.log(a);
//[aa: "bb"]
//aa: "bb"
//length: 0

霸气的把length=0化了线zhuai给他。JSer们并不怎么用这个奇怪的写法是有原因的啊。length=0了你要我们怎么办!.pop()和.shift()等作用于数组元素的方法你要我们怎么用?恩?

再者,如果不是 === 的情况下,JS很难分清'1'和1有什么区别。所以如果你的下标突然变成了一个字符串数字就有意思了。

let a=[];
a['aa']='bb';
a['100']='vvvvv';
console.log(a.length);
//101

就是这么神奇。js表示’100’和100长得一样啊并没有区别啊那个引号是什么我读书少你别骗我。所以这个时候js会自动把a[‘100’]当成a[100]来使用,把当前数组的长度变成100,再把'vvvvv'这个value push到最后,哪怕真实长度只有2……

所以,这是为啥?

当给一个js数组添加字符串下标的时候,就相当于为该数组对象添加了一个自定义属性,这就是所谓的“字符串下标”。而为数组添加属性并不会增加数组长度,所以长度不会发生改变了。你到是能用key找到这个value,但是你并没有办法遍历它。

a.forEach(v=>console.log(v))
//'vvvvv'

看你只能得到后来增加的那个index为101的'vvvvv'。

所以呢,来自stackoverflow的Michael Berkowski:“如果要使用的是一个完全由'字符串下标'组成的数组,那还是将其声明为一个Object类型的对象要更好一些。”

对啊,有对象干嘛还要找数组!数组长得比对象美吗!口亨!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,452评论 0 4
  • javascript数组中数字和非数字下标的区别 因为在之前看多的许多JavaScript书籍中,都宣称js是可以...
    话少为环保阅读 3,392评论 0 0
  • 第1章 认识JS JavaScript能做什么?1.增强页面动态效果(如:下拉菜单、图片轮播、信息滚动等)2.实现...
    mo默22阅读 5,192评论 0 5
  • 发顾v吃饭骨灰级
    逸中来阅读 1,150评论 0 0
  • 1 信息越来越多,意义越来越少 信息如梦如幻,如同幽灵。互联网时代我们“掌握”的知识越来越多,信息越来越唾手可得,...
    竹说阅读 1,514评论 0 0