检查集合中的值的Javascript命令?

检查集合中的值的Javascript命令?,javascript,Javascript,我试图找到一种创造性的方法/补丁,以尽量减少这一行: if(myParam == '1' || myParam == 'a' || myParam == '*' || myParam == '@' || myParam == undefined || myParam == null || myParam == ' ') {... } 一种解决方案是使用indexOf,但它不是跨浏览器的 (我可以写我自己的函数来表现得像indexOf——但我不想) 所以我在 但是in操作符只处

我试图找到一种创造性的方法/补丁,以尽量减少这一行:

 if(myParam == '1' || myParam == 'a' || myParam == '*' || myParam == '@' || myParam == undefined || myParam == null || myParam == ' ')
    {...
    }
一种解决方案是使用indexOf,但它不是跨浏览器的 (我可以写我自己的函数来表现得像indexOf——但我不想)

所以我在

但是in操作符只处理对象属性名称和索引

所以我尝试了这个(对象属性):

我认为这是可行的

2问题:

问题#1

属性名为[
未定义
]或[
'
]或[
]是否安全?它会一直有效吗

问题#2 有没有其他解决办法


(案例/切换也可以,我知道…

对于未定义的,您所拥有的将不起作用。您可以有一个名为
“undefined”
的属性,但这是一个字符串名称,而不是实际的
undefined
值。您可以通过类型转换获得匹配,但如果您有一个名为
“undefined”
的字符串,它也会匹配,而这不是您想要的

我建议使用更明确的测试,使用
==
来避免任何类型转换。有几种方法比您以前的方法稍微简单一些:

if (myParam === null || myParam === undefined || 
    (myParam && myParam.length == 1 && "1a*@ ".indexOf(myParam) !== -1) {
   // code here
}
或者,您可以创建一个数组和自己的跨浏览器功能(或者使用polyfill for
array.indexOf()
搜索一个可以保存所有值的数组:

function inArray(val, array) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === val) {
            return(true);
        }
    }
    return(false);
}

var testValues = [null, undefined, "1", "a", "*", "@", " "];
if (inArray(window.lala, array)) {
    // your code here
}
我的建议是第一个选项,因为我认为它是最干净的,而且通过向测试字符串添加更多字符来扩展它也非常容易

属性名为
[undefined]
['
]或
[null]
是否安全?是否始终有效

所有属性名称都转换为字符串,这意味着您无法区分数字
0
和字符串
'0'
,也无法区分值
null
未定义
)和字符串
'null'
'undefined'

在您的情况下,将数字视为数字字符串可能没问题,对于
undefined
null
,我只需添加一个额外的测试:

if(value == null || value in exclude) {
    // ...
}

value==null
true
如果
value
null
undefined
1:最好使用'undefined'和'null'作为对象的名称,因为当您使用for-in循环遍历对象时,它会检查属性的字符串表示形式(如果执行以下操作,您可以检查它):

 for(prop in obj) typeof(prop) //this will be a string
2:您还可以将值存储在数组中并执行递归:

 var vals = ['*', 'a', '@', ' ', undefined, null], param = '@', i = 0;

function checkVals(param, vals, i) {
    if (vals[i] && param === vals[i]) {
        console.log(1);
        return;
    } 

    checkVals(param, vals, i + 1);
}

checkVals(param, vals, i);

@RoyiNamir-但是测试对象中的属性名不是未定义的。
所有属性名都是字符串,因此
未定义!==“未定义”
因此它在对象查找中不匹配。我不明白。
如果(在{0':0'*:0,'a':0'':0,未定义:0,null:0})警报('1')是的alert@jfriend00:当您在
中使用
时,您测试的值将转换为字符串。这就是它“工作”的原因。@RoyiNamir-您通过类型转换生活在危险之中。请注意,
如果在{0':0'*':0,'a':0':0,未定义:0,null:0}中(“未定义”)警报('1')
也会运行警报。@FelixKling我想你想告诉我:-)为什么要使用递归而不是简单循环?如果你愿意,可以使用简单循环。我只展示了一种解决这个问题的方法:)
 for(prop in obj) typeof(prop) //this will be a string
 var vals = ['*', 'a', '@', ' ', undefined, null], param = '@', i = 0;

function checkVals(param, vals, i) {
    if (vals[i] && param === vals[i]) {
        console.log(1);
        return;
    } 

    checkVals(param, vals, i + 1);
}

checkVals(param, vals, i);