目前我正在编写一系列关于JavaScript编码的实验室作品。我知道有像
这样的结构if ('field' in object) {
/* Do something with object.field */
}
用于确定名为field
的变量确实存在于object
中,即使它等于未定义。
我的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
。答案 0 :(得分:5)
if (0 in array)
- 这是否合法?
不确定。 in
运算符检查对象中是否存在属性(直接或通过原型链)。左侧操作数是属性的名称,右侧操作数是要检查的对象。如果左手操作数不是字符串或Symbol
,则它会被强制转换为字符串。这完全在the specification之内:
The in
operator(向下滚动至 RelationalExpression:ShiftExpression中的RelationalExpression )
JavaScript的非类型化数组是对象(和not really arrays,尽管引擎会在可能时优化它们)。数组索引是属性名称(技术上是字符串,尽管引擎会在可能的情况下对其进行优化)。因此,您可以使用in
来检查数组是否包含属性,方法是使用&#34;数组索引&#34;使用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));
}
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;