检查集合中的值的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 forarray.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);