Cos*_*ych 0 javascript syntax cross-browser
现在我正在编写一个关于JavaScript编码的实验室作品.我知道有一种类似的结构
if ('field' in object) {
/* Do something with object.field */
}
Run Code Online (Sandbox Code Playgroud)
用于确定一个名为field
true 的变量,object
即使它等于undefined也是如此.
我的Firefox Developer Edition 44能够确定数组中是否有这样的字段:
if (0 in array) {
/* Do something with first element */
}
Run Code Online (Sandbox Code Playgroud)
问题是:这种方法合法吗?它是生活标准的一部分吗?
它应该做什么:
让q成为具有这些元素的数组:
[ 5, <1 empty slot>, undefined, 5 ]
Run Code Online (Sandbox Code Playgroud)
然后:
0 in q
,2 in q
,3 in q
等于true
;1 in q
等于false
.
if (0 in array)
- 这甚至合法吗?
当然.的in
操作者检查是否(直接地,或者经由原型链)在对象存在的属性.左侧操作数是属性的名称,右侧操作数是要检查的对象.如果左侧操作数不是字符串Symbol
,则强制转换为字符串.这完全符合规范:
该in
运营商(向下滚动到RelationalExpression:RelationalExpression在ShiftExpression)
JavaScript的无类型数组是对象(而不是真正的数组,尽管引擎会在可能时优化它们).数组索引是属性名称(技术上是字符串,尽管引擎会在可能时优化它们).因此,您可以使用in
"数组索引" in
和数组来检查数组是否包含属性.(您也可以使用hasOwnProperty
:theArray.hasOwnProperty(0)
,但现代引擎上的数组速度较慢.)
该怎么做:
设q是一个包含这些元素的数组:
Run Code Online (Sandbox Code Playgroud)[ 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));
}
Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
243 次 |
最近记录: |