不是未定义»,javascript,arrays,filter"/>

首页 > 解决方案 > JavaScript «检测不是未定义»

问题描述

如何检测数组中的“空槽”?“空槽”不是“未定义”!

<script type="text/javascript">
    const has = [1, 2, /*empty slot*/, 4, undefined, 6, /*empty slot*/];
    console.log(has[2] === undefined); // true - but, is <empty slot>!!!
    console.log(has[4] === undefined); // true - needle.
</script>

谢谢!)

标签: javascriptarraysfilter

解决方案


您将使用in运算符或hasOwnProperty方法:

const has = [1, 2, /*empty slot*/, 4, undefined, 6, /*empty slot*/];
console.log(2 in has);              // No property called 2
console.log(has.hasOwnProperty(2)); // No property called 2
console.log(4 in has);              // There is one called 4
console.log(has.hasOwnProperty(4)); // There is one called 4

in检查对象及其属性的原型。hasOwnProperty只检查对象本身,而不是它的原型。由于Array.prototype没有定义任何名称如 2 和 4 的属性(并且永远不会),因此两者都有效。(一个会比另一个快,但是这可能会因 JavaScript 引擎而异,这可能并不重要......)

这些是根据对象定义的,而不是专门的数组,但是您可以在此处使用它们,因为 JavaScript 中的标准数组对象,它们只是对一类属性进行特殊处理(其名称是为数组索引定义的形式的字符串[参见规范]),一个特殊length属性,继承自Array.prototype. 更多在我的博客文章A Myth of Arrays中。

如果要在给定索引的情况下找到下一个空槽n,则:

var emptySlot = -1;
while (n < array.length) {
    if (!(n in array)) { // or `if (!array.hasOwnProperty(n)) {`
        emptySlot = n;
        break;
    }
    ++n;
}

推荐阅读