`if (0 in array)`——这合法吗?

Posted

技术标签:

【中文标题】`if (0 in array)`——这合法吗?【英文标题】:`if (0 in array)` — is this even legal? 【发布时间】:2016-02-09 02:39:31 【问题描述】:

目前,我正在编写关于 javascript 编码的复杂实验室作品。我知道有这样的结构

if ('field' in object) 
    /* Do something with object.field */

用于确定field 中是否确实存在名为field 的变量,即使它等于未定义。

而我的 Firefox Developer Edition 44 能够确定数组中是否有这样的字段:

if (0 in array) 
    /* Do something with first element */

问题:这种方法合法吗?它是生活水平的一部分吗?


应该做什么: 让 q 是一个包含这些元素的数组:

[ 5, <1 empty slot>, undefined, 5 ]

然后:

0 in q2 in q3 in q 等于 true1 in q 等于 false

【问题讨论】:

&lt;1 empty slot&gt;”是什么意思? @hindmost:JavaScript 数组本质上是稀疏的。它们可以有空元素。 @T.J.克劳德 是的,我知道。但是 AFAIK 这样的空元素与undefined 相同。所以 OP 的数组样本似乎模棱两可。 @hindmost:根本不存在的属性与值为undefined的属性之间存在显着差异。如果你这样做obj.prop,那么在这两种情况下,result 都是undefined,但发生这种情况的机制完全不同。 Missing-vs-present-with-undefined 还对for-in 循环、forEachObject.keys、... 产生影响 【参考方案1】:

if (0 in array) — 这合法吗?

当然。 in 运算符检查对象中是否存在属性(直接或通过原型链)。左边的操作数是属性的名称,右边的​​操作数是要检查的对象。如果左侧操作数不是字符串或Symbol,它会被强制转换为字符串。这一切都在the specification之内:

The in operator(向下滚动到 RelationalExpression : RelationalExpression in ShiftExpression

The abstract ToPropertyKey operation

The abstract HasProperty operation

JavaScript 的无类型数组是对象(和not really arrays,尽管引擎会尽可能优化)。数组索引是属性名称(技术上是字符串,尽管引擎会在可能的情况下对其进行优化)。因此,您可以使用in 使用带有in 和数组的“数组索引”来检查数组是否包含属性。 (你也可以使用hasOwnPropertytheArray.hasOwnProperty(0),但是it's slower with arrays on modern engines。)

它应该做什么:

令 q 为包含此类元素的数组:

[ 5, <1 empty slot>, undefined, 5 ]

然后:

0 in q2 in q3 in q 等于 true1 in q 等于 false

是的,这是完全有效的:

var q = [];
q[0] = 5;
q[2] = undefined;
q[3] = 5;
for (var i = 0; i < q.length; ++i) 
  snippet.log(i + " in q? " + (i in q));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

【讨论】:

section 6.1.7. 现在我看到了@_@ @T.J.克劳德,谢谢你这么详细的回复?

以上是关于`if (0 in array)`——这合法吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 thinkphp中的<if>condition条件中可以用IN 么?

C语言两个数组里边有十个元素把两个合并成一个并排序

81. Search in Rotated Sorted Array II

81.Search in Rotated Sorted Array II

[Algorithm] Search element in a circular sorted array

153. Find Minimum in Rotated Sorted Array