最近在撸公司的项目,前后端加后台的数据分析一起挑,脑子里的js语法和Python语法大乱斗,由此闹出了很多让人哭笑不得的乌龙,比如今晚踩的一个js的坑。

先抛出两张图作比较(上图为Python语句,下图为javascript):

javascript陷阱之in语句-冯金伟博客园

javascript陷阱之in语句-冯金伟博客园

很好,in语句似乎通用于py和js判断一个元素是否存在于数组之中,然而,神奇的还在下面(javascript代码):

javascript陷阱之in语句-冯金伟博客园

javascript陷阱之in语句-冯金伟博客园

???3不在数组[3 , 2 , 1]里???

???”a”不在数组[“a” , “b”]里???

问题在于,in在JavaScript世界中的作用和in在Python世界中的作用有所不同。

in语句在Python世界中即可用于List对象,也可用于Dict对象(val1 in dict1 判断val1是否在dict1的key的集合里)。

然而,in语句在JavaScript中只可用于Object对象,正确用法如下图:

javascript陷阱之in语句-冯金伟博客园

那么在写JavaScript代码的时候,如何判断元素是否存在于Array对象中呢?

1.原生js方法之遍历大法:

1 function in_array(searchString,array) {
2   for (i=0;i<array.length;i++) {
3     if ( searchString == array[i] ) return true;
4   }
5   return false;
6 }
7 if ( in_array('oak',trees) ) document.write('true'); //显示true
8   else document.write('false');

2.原生js方法之合理利用in操作符:

(既然我们知道in 可以用于判断对象的属性值,那么,同样的,我们可以把数组一一映射到对象的属性,然后再用in 判断。)

 1 function oc(a)
 2 {
 3   var o = {}; //相当于var o = new Object();
 4   for(var i=0;i<a.length;i++)
 5   {
 6     o[a[i]]=''; //注意该写法,不能写成o.a[i]
 7   }
 8   return o;
 9 }
10 if ( 'oak' in oc(trees) ) document.write('true'); //显示true
11   else document.write('false');
12 o = oc(trees);
13 if ( o.oak != 'undefined' ) document.write('true'); //显示true
14   else document.write('false'); //true
15 if ( o['oak'] != 'undefined' ) document.write('true'); //显示true
16   else document.write('false'); //true

参考自:https://snook.ca/archives/javascript/testing_for_a_v

3.jquery大法:

1 $.inArray(value, array)