`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 q
、2 in q
、3 in q
等于 true
;
1 in q
等于 false
。
【问题讨论】:
“<1 empty slot>
”是什么意思?
@hindmost:JavaScript 数组本质上是稀疏的。它们可以有空元素。
@T.J.克劳德 是的,我知道。但是 AFAIK 这样的空元素与undefined
相同。所以 OP 的数组样本似乎模棱两可。
@hindmost:根本不存在的属性与值为undefined
的属性之间存在显着差异。如果你这样做obj.prop
,那么在这两种情况下,result 都是undefined
,但发生这种情况的机制完全不同。 Missing-vs-present-with-undefined 还对for-in
循环、forEach
、Object.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
和数组的“数组索引”来检查数组是否包含属性。 (你也可以使用hasOwnProperty
:theArray.hasOwnProperty(0)
,但是it's slower with arrays on modern engines。)
它应该做什么:
令 q 为包含此类元素的数组:
[ 5, <1 empty slot>, undefined, 5 ]
然后:
0 in q
、2 in q
、3 in q
等于true
;1 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 么?
81. Search in Rotated Sorted Array II
81.Search in Rotated Sorted Array II