`如果(数组中的0)` - 这是否合法?

现在我正在编写一个关于JavaScript编码的实验室工作的综合体。 我知道有这样的建筑

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

用于确定称为field的变量确实存在于object即使它等于未定义。

而且我的Firefox开发版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

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

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

  • in运算符(向下滚动到ShiftExpression中的RelationalExpression:RelationalExpression)

  • 抽象的ToPropertyKey操作

  • 抽象的HasProperty操作

  • JavaScript的无类型数组是对象(并且不是真正的数组,尽管引擎会尽可能地优化它们)。 数组索引是属性名称(在技术上是字符串,尽管引擎会尽可能地优化它们)。 所以,你可以使用in检查一个数组包含的属性通过使用“数组索引”与in和阵列。 (您也可以使用hasOwnPropertytheArray.hasOwnProperty(0) ,但在现代引擎上数组的速度会更慢。)

    它应该做什么:

    设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>
    链接地址: http://www.djcxy.com/p/4691.html

    上一篇: `if (0 in array)` — is this even legal?

    下一篇: Javascript IN operator compatibility