`如果(数组中的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
和阵列。 (您也可以使用hasOwnProperty
: theArray.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