js中的in

jsin

一个做Java的朋友突然在群里问:

1
2
3
4
ele.addEventListener('keydown', function(e) {
// result is false, why?
console.log(e.keyCode in [13]);
}, false);

上面的代码为什么是false?当时自己还是挺懵逼的,查了资料瞄了一眼(被误导了),然后在调试工具里写下了这样的代码:

1
2
// result is true
console.log(1 in [1, 2, 3]);

当时的想法就是:这不就是对的吗?可是上面为啥就是不对呢?正好最近自己也在公司搞一个打字的小游戏,由于本人基础不好,对键盘事件还是半知半解,于是就开始疯狂的查js的键盘事件,这个后面写个总结吧!转回来,上面为什么呢?

其实上面的问题我们一直忽略了个问题,1 in [1, 2, 3]中的1到底指的是什么?于是,我好好好的看了自己查的资料,被误导了啊!

js中的in可以用在对象和数组上,那么代表的意义分别是:

  1. 对象里判断的是属性名
  2. 数组里判断的是下标值这个位置是否有值,不管是不是undefined,null之类的

也就是1 in [1, 2, 3]true,不是因为数组里有1这个值,而是因为数组[1]这个位置有值,这个值哪怕是false, undefined,null,0....都可以。我们经常在for里面用,下面上代码更直接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 对象
var obj = {
name: 'w3ctalk',
age: 12
};
console.log('name' in obj); // true
for(var key in obj) {
console.log(key); // name,age
}
// 数组
var arrA = [1, 2, 4, 10];
var arrB = [,,,,,];
var arrC = [, null, , ,]
console.log(arrA.length); // 4
console.log(arrB.length); // 5
console.log(arrC.length); // 4
for(var a in arrA) {
console.log(a); // 0,1,2,3
}
for(var b in arrB) {
console.log(b); // 啥也没有
}
for(var c in arrC) {
console.log(c); // 1
}
console.log(10 in arrA); // false
console.log(3 in arrA); //true
console.log(1 in arrB); // false
console.log(1 in arrC); // true

在查到的资料里,for那个部分是写错的,导致我认为in应用于数组就是循环数组的val。以后再查什么东西,还是要自己亲自试验下,太不靠谱了!

zhiyi

你可骗不了我这智慧的大脑!