2015-11-08 62 views
0

现在我写了一个关于JavaScript编码的实验室工作的综合体。我知道,有一个像`if(0 in array)` - 这是否合法?

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

被用来确定确实存在在object一个名为field变量,即使它等于未定义的结构。

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

你是什么意思的 “'<1个空插槽>'” 吗? – hindmost

+0

@ behindmost:JavaScript数组本质上是稀疏的。他们可以有空的元素。 –

+0

@ T.J。克劳德是的,我知道。但AFAIK这样的空元素与undefined相同。所以OP的数组样本似乎不明确。 – hindmost

回答

5

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

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

JavaScript的ü ntyped数组是对象(并且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等于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>

+0

[第6.1.7节](http://www.ecma- international.org/ecma-262/6.0/index.html#sec-object-type)现在我看@ @ @ @TJ克罗德,谢谢你这样的详细回应 – CosmoMyzrailGorynych