`if(0 in array)` - 这是否合法?

时间:2015-11-08 09:10:48

标签: javascript syntax cross-browser

目前我正在编写一系列关于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 q2 in q3 in q等于true;
  • 1 in q等于false

1 个答案:

答案 0 :(得分:5)

  

if (0 in array) - 这是否合法?

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

JavaScript的非类型化数组是对象(和not really arrays,尽管引擎会在可能时优化它们)。数组索引是属性名称(技术上是字符串,尽管引擎会在可能的情况下对其进行优化)。因此,您可以使用in来检查数组是否包含属性,方法是使用&#34;数组索引&#34;使用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等于true;
  •   
  • 1 in q等于false
  •   

是的,这完全有效:

&#13;
&#13;
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;
&#13;
&#13;