javascript陷阱之in语句
最近在撸公司的项目,前后端加后台的数据分析一起挑,脑子里的js语法和Python语法大乱斗,由此闹出了很多让人哭笑不得的乌龙,比如今晚踩的一个js的坑。
先抛出两张图作比较(上图为Python语句,下图为javascript):
很好,in语句似乎通用于py和js判断一个元素是否存在于数组之中,然而,神奇的还在下面(javascript代码):
???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代码的时候,如何判断元素是否存在于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)