javascript - 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>
谢谢!)
解决方案
您将使用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;
}
推荐阅读
- webpack - 无法使用 --bundle 设置全局自定义“cssFile”。(没有 --bundle 也可以)
- html5-canvas - 如何从 websocket onmessageevent 以更快的速度绘制图像画布
- javascript - 需要帮助了解为什么我在计算虚数时得到非数字输出
- html - 在 td 内部,如何将“文本溢出:省略号”应用于某些元素,但不是全部?
- mysql - 在 PostgreSQL 中使用 SQL 平衡值
- php - 指向特定页面 woocommerce 的按钮链接
- c# - 将程序集部署为 .Net Framework 的一部分
- swift - 为什么不能在函数中使用协议`Encodable`作为类型
- winforms - 标签大小将根据屏幕分辨率c# winform增长
- rest - 使用从 SharePoint 中的文档库中获取的 rest api 过滤数据