为什么for-in访问不到空数组的数组元素?

发布于 2022-09-11 15:20:04 字数 142 浏览 9 评论 0

我想给数组赋值,但是为什么for-in访问不到空数组的数组元素?

var arr=new Array(2);
for(var i in arr){
    arr[i]=10;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

提赋 2022-09-18 15:20:04

for in 只能遍历可枚举的属性且存在的值,undefined相当于没有值。

一个人的夜不怕黑 2022-09-18 15:20:04

因为for in遍历的是对象的key,空的数组是没有key的

var arr=[10,20,33,44] //var arr={'0':10,'1':20,'2':33,'3':44}
for(var i in arr){
    console.log(i)//0 1 2 3
}
尽揽少女心 2022-09-18 15:20:04

写的有毛病....
for...in 循环只遍历可枚举属性

对风讲故事 2022-09-18 15:20:04

for-in 语句 可以遍历对象 自身的可枚举属性 和其 原型链上的可枚举属性
这里得了解对象的属性描述符。。。
通过 Array(num) 生成的数组项(稀疏数组项),没有初始化生成属性描述符,就自然无法遍历。

var arr = new Array(2);
Object.getOwnPropertyDescriptor(arr, '0'); // undefined

Object.getOwnPropertyDescriptor(arr, 'length')
// {value: 2, writable: true, enumerable: false, configurable: false}
慵挽 2022-09-18 15:20:04

数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。

Array(3) // [, , ,]

上面代码中,Array(3)返回一个具有 3 个空位的数组。
注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。

0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false

上面代码说明,第一个数组的 0 号位置是有值的,第二个数组的 0 号位置没有值。

ES5 对空位的处理,已经很不一致了,大多数情况下会忽略空位。

  • forEach(), filter(), reduce(), every() 和some()都会跳过空位。
  • map()会跳过空位,但会保留这个值
  • join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
// forEach方法
[,'a'].forEach((x,i) => console.log(i)); // 1

// filter方法
['a',,'b'].filter(x => true) // ['a','b']

// every方法
[,'a'].every(x => x==='a') // true

// reduce方法
[1,,2].reduce((x,y) => x+y) // 3

// some方法
[,'a'].some(x => x !== 'a') // false

// map方法
[,'a'].map(x => 1) // [,1]

// join方法
[,'a',undefined,null].join('#') // "#a##"

// toString方法
[,'a',undefined,null].toString() // ",a,,"

ES6 则是明确将空位转为undefined。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文