数组超出界限:与未定义或长度检查的比较?

Man*_*nav 23 javascript arrays

这似乎是一个常见的JavaScript用法:

function foo (array, index) {
    if (typeof array[index] == 'undefined')
        alert ('out of bounds baby');
}
Run Code Online (Sandbox Code Playgroud)

而不是更普遍(在其他语言中)和概念上更简单:

function foo (array, index) {
    if (index >= array.length)
        alert ('boo');
}
Run Code Online (Sandbox Code Playgroud)

据我所知,第一种情况也适用于其中有"间隙"的阵列,但这是一个足以保证成语的常见情况吗?

可以在此处看到提示此问题的代码示例.在这种情况下,当在函数内部使用'argument'变量时,假设它是一个连续的数组是不是很明智?

小智 30

唯一正确的方法是检查索引与长度.

可以为元素分配值undefined.把它用作这里的哨兵真是太傻了.(可能存在检查未定义的其他,有效且可能重叠的原因,但不是"对于越界检查" - 当给定arg的值确实 存在时,另一个问题中的代码将呈现可能错误的结果undefined. )

快乐的编码.


Sop*_*ert 16

你也可以写:

if (index in array) {
Run Code Online (Sandbox Code Playgroud)

即使array[index]设置为,它也会返回true undefined.

  • 这并不总是有效 - 尽管我相信它总是可以在`arguments`的情况下工作,它只是"类似数组" - 因为JavaScript中的数组是"稀疏的".这就是为什么`for(v in array){...}`有时会出问题.(有一个'undefined`值,这适用于,和*not set*index,这是错过的)之间的区别.例如,考虑`var a = []; a [1] ="foo"; a`中的0表示错误.`a`中的数组具有自己的属性"1"和"length",但它没有名为"0"的属性. (7认同)