请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问Array(5)生成的是数组还是伪数组

老师好,您在其他同学的答复中提及伪数组不能使用forEach方法遍历,那么,Array(5)生成的是不是数组呢?如果是数组的话,为什么forEach不能将它的元素改变?

代码如下:
let array = Array(5)
array.forEach((val, id, arr) => {
arr[id] = 1
})
//浏览器运行结果:[ ,,,,,]

但是,这段代码:
let array = [1, 2, 3, 4, 5]
array.forEach((val, id, arr) => {
arr[id] = 1
})
//浏览器运行结果:[1, 1, 1, 1, 1]

若同为数组,为何两个结果相去甚远?

谢谢。

正在回答 回答被采纳积分+3

2回答

supoxiao 2020-02-19 17:11:07

let array = Array(5) 创建的是一个稀疏数组,对于稀疏数组forEach方法不会调用传入的第一个参数(函数)

0 回复 有任何疑惑可以回复我~
快乐动起来呀 2019-12-23 20:45:54

你打印下第一个array的vak,id

0 回复 有任何疑惑可以回复我~
  • 提问者 samudaodan #1
    啊 是不是因为元素为空时不会调用回调?
    回复 有任何疑惑可以回复我~ 2019-12-24 11:21:42
  • console.log(Array.isArray(array)) // true,所以Array(5)生成的不是伪数组。
    单独赋值是可以成功的 array[0] = 2
    forEach赋值不成功盲猜同学的回复是正确的,Array(5)只是声明了一块空间来存放一个5个元素的数组,但地址具体是什么还没有分配,每个元素只有在赋值的时候才会指定具体的key存放地址,所以forEach的时候key为空,就无法赋值。
    就如下,我先赋值一个元素,那么赋值的那个元素是会变成1的,其余未赋值的元素仍然是Empty
    
    array[0] = 2
    array.forEach((val, id, arr) => {
      console.log('before:', val, id, array)
      arr[id] = 1
      console.log('hou:', val, id)
    })
    console.log(array) // [1, empty * 4]
    回复 有任何疑惑可以回复我~ 2019-12-26 11:17:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信