javascript - js中数组的undefined为什么不会被遍历
问题描述
问题描述并不全面
我的问题是,当我的数组是如下定义的时候:
let a = [undefined, undefined]a[9] = 1console.log(a)//[undefined, undefined, undefined × 7, 1]
这里自动生成的undefined与我定义的有什么区别吗?
为什么我用自带遍历的时候也不会遍历到他们?
a.forEach(it => console.log(it)) // 也只会有三个结果
问题解答
回答1:因为你定义的是一个稀疏数组(sparse array,数组长度比数组元素个数大的数组). 可以用in检测它的数组元素是否存在:
’0’ in a // true,索引存在.’1’ in a // true’2’ in a // false,索引不存在’9’ in a // true
而 forEach 只会遍历原本那些索引存在的元素.
回答2:这里自动生成的undefined与我定义的有什么区别吗?
这是数组的一个陷阱,此 undefined 非彼 undefined。自动生成的叫“empty slots”,恰好 chrome 对它显示 undefined 而已。你也可以看到,真正的 undefined 是一个个输出来的,empty slots 是输出“undefined × 7”这样的字样。
forEach, map 之类的都会跳过 empty slots。解决方法可以参考
console.log(Array.from(a))回答3:
因为forEach就是这么写的,自带的forEach遇到undefined会continue你可以自己写一个不跳过的版本
回答4:你可以换一个角度想这个问题:var a = [1,2,3,4]delete a[0]console.log(a)//[undefined × 1, 2, 3, 4]a.length//4a.forEach(it=>console.log(it))// 2 3 4回到问题上,forEach封装的时候,会跳过这个“undefined”,你可以重写一下这个方法,无论是什么样子的值,应该都是可以正常打印的
相关文章:
1. javascript - 求解答:实例对象调用constructor,此时constructor内的this的指向?2. Windows系统能否利用Docker使用Ubuntu吗?Ubuntu能使用本机的显卡吗?3. python的MySQLdb库中的executemany方法如何改变默认加上的单引号?4. 请教,关于python字典,合并相同值的键的实现方法5. css3中translate(-50%,-50%)对 transform-origin的奇葩影响?6. mysql5.7就没有官方性质的详细配置文件吗?求大神告知7. javascript - 如何将 windows 下编辑器中的 CRLF 替换为 LF?8. css - chrome浏览器input记录上次cookie信息后,有个黄色背景~如何去除!9. android - 京东移动端网页和其app加载的url所做的呈现不应该是完全一样的吗?10. html5 - 在一个页面中 初始了两个swiper 不知道哪里错了 一直不对

网公网安备