【发布时间】:2019-10-23 21:25:54
【问题描述】:
在 Javascript 中使用这种循环是否安全?
denseArray = [1,2,3,4,5, '...', 99999]
var x, i = 0
while (x = denseArray[i++]) {
document.write(x + '<br>')
console.log(x)
}
document.write('Used sentinel: ' + denseArray[i])
document.write('Size of array: ' + i)
使用内置哨兵,它比 for 循环更短,并且对于大型数组可能也更有效。 sentinel 将调用者标记为发生了一些非常不寻常的事情。
数组必须是dense array 才能工作!这意味着没有其他 undefined 除了数组中最后一个元素之后的值。我几乎从不使用稀疏数组,只使用密集数组,所以这对我来说没问题。
要记住的另一个更重要的点(感谢@Jack Bashford 提醒)是这不仅仅是未定义为哨兵。如果数组值为 0、假或任何其他假值,则循环将停止。所以,你必须确保数组中的数据没有falsy values,即0、""、''、``、null、undefined和NaN。
这里是否存在“超出范围”问题,或者我们可以将 Javascript 中的数组视为“无限”,只要内存未满? 未定义是否意味着浏览器可以将其设置为任何值,因为它是未定义的,还是我们可以认为条件测试总是有效的? Javascript 中的数组很奇怪,因为“它们是对象”所以问得更好。
我无法使用以下标签在 Stackoverflow 上找到答案:[javascript] [sentinel] [while-loop] [arrays]。 结果为零!
我已经考虑了一段时间,并用它来开始担心。但我想使用它,因为它优雅、易于查看、简短,并且可能在大数据中有效。 i 是数组的大小很有用。
更新
- @Barmar 告诉:JS 保证一个未初始化的数组 元素将返回未定义的值。
- MDN confirms: 使用 无效的索引号返回未定义。
- @schu34 的注释:最好使用
denseArray.forEach((x)=>{...code})对其使用进行优化并为开发人员所知。无需遇到虚假值。它有good browser support。
【问题讨论】:
-
嗯,这不是只是
undefined作为哨兵。如果数组值为0、false或任何其他虚假值,则循环将停止。 -
好点!我必须编辑:)
-
这会起作用,但它是单调的,所以其他程序员会觉得它令人困惑。我看不出它比
for循环或使用forEach()方法“更有效”。 -
JS保证未初始化的数组元素返回值
undefined。 -
值得注意的是,大多数 JS 开发人员倾向于使用高阶函数来迭代数组。类似
denseArray.forEach((x)=>{...code})
标签: javascript arrays while-loop sentinel