3

我试图找到一种创造性的方式/补丁来最小化这条线:

 if(myParam == '1' || myParam == 'a' || myParam == '*' || myParam == '@' || myParam == undefined || myParam == null || myParam == ' ')
    {...
    }

一种解决方案是使用 indexOf - 但它不是跨浏览器 (我可以编写自己的函数来表现得像 indexOf - 但我不想这样做)。

所以我尝试了 in 运营商

但是 in 运算符只处理对象属性名称索引

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

   if(window.lala in {
    '*': 0,
    'a': 0,
    '@': 0,
    ' ': 0,
    undefined: 0,
    null: 0
}) alert('1')

我认为它正在工作。

2个问题:

question #1

属性名称为 [ undefined] 或 [ ' '] 或 [ null] 是否安全?它会一直工作吗?

question #2 有没有其他解决方案可以做到这一点?

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

4

3 回答 3

1

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

我建议使用更明确的测试===来避免任何类型转换。有几种方法可以做到这一点,它们比你所拥有的稍微简单一些:

if (myParam === null || myParam === undefined || 
    (myParam && myParam.length == 1 && "1a*@ ".indexOf(myParam) !== -1) {
   // code here
}

或者您可以创建一个数组和您自己的跨浏览器函数(或使用 polyfillArray.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
}

null您可以使用您正在试验的对象形式,并且只对and使用显式测试undefined,但我认为string.indexOf()我的第一个建议中的建议更简单。无论如何,这是使用对象的安全形式

if (myParam === null || myParam === undefined || 
    (myParam && (myParam in {"*":0, "1":0, "a":0, "@":0, " ":0})) {
   // code here
}

我的建议是第一个选项,因为我认为它是最干净的,而且只需在测试字符串中添加更多字符就可以很容易地扩展它。

于 2012-10-11T07:37:45.733 回答
1

属性名称是[undefined]or [' '] or是否安全[null]?它会一直有效吗?

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

在您的情况下,将数字视为数字字符串可能很好,对于undefinedand null,我只想添加一个额外的测试:

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

value == nulltrue如果valuenullundefined

于 2012-10-11T07:39:36.370 回答
0

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);
于 2012-10-11T07:49:30.227 回答