在JavaScript中链接逻辑运算符的简写?

问题描述:

有没有更好的方式在javascript中编写以下条件?在JavaScript中链接逻辑运算符的简写?

if (value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something') { 
    // blah blah blah 
} 

我讨厌将所有这些逻辑或串在一起。我想知道是否有某种速记。

谢谢!

var a = [1, 16, -500, 42.42, 'something']; 
var value = 42; 
if (a.indexOf(value) > -1){ 
// blah blah blah 
} 

Upd: 评论中提出的效用函数示例:

Object.prototype.in = function(){ 
    for(var i = 0; i < arguments.length; i++){ 
    if (this == arguments[i]) return true; 
    } 
    return false; 
} 

所以你可以这样写:

if (value.in(1, 16, -500, 42.42, 'something')){ 
// blah blah blah 
} 
+8

只要知道'Array.prototype。indexOf'方法在IE上不可用。 – CMS 2010-05-28 20:15:34

+1

@CMS感谢您的宝贵通知。虽然,可以立即修复。 http://*.com/questions/1744310/how-to-fix-array-indexof-in-javascript-for-ie-browsers – Li0liQ 2010-05-28 20:18:11

+0

这可能会产生一个很好的实用功能,以避免使if语句比原版的。只需传递一组值就可以了,您可以使用简写语法。 – JohnFx 2010-05-28 20:26:01

不,这是简写。

作为替代,你可以做一个switch

switch (value) { 
case 1 : 
case 16 : 
case -500 : 
    .... 
} 

,如果你需要大量的可能值的哪一个更容易管理,但实际上你的版本是较短反正:)

+0

如果它被混合,你可以将值转换为字符串并进行字符串比较。较慢但可能。我也认为这个选项比..indexOf选项更可读。 – 2010-05-28 20:16:04

+0

哦,你是对的,我认为这是Java不是JavaScript :) – oedo 2010-05-28 20:17:00

你可以扩展数组对象:如果您存储在数组中,你可以做类似MyValues.contains(值),则所有这些值

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i] == obj) { 
     return true; 
    } 
    } 
    return false; 
} 

然后

+0

如果预期不会使用类型强制,那么我会推荐使用'==='而不是'==',但是使用这种方法的IMO,最好的办法是使用标准的[ 'Array.prototype.indexOf'](https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf)方法,如[@ Li0liQ](http://*.com/questions/2932131/short-hand-for-chaining-logical-operators-in-javascript/2932166#2932166)提及,可以*本机*在除IE以外的所有浏览器上使用。 – CMS 2010-05-28 20:24:39

+0

我不是JavaScript的专业人士 - 很高兴知道。谢谢 – Prescott 2010-05-28 20:28:32

切换是一个可以接受的选择。您也可以使用地图,具体取决于问题的复杂性(假设您的示例中包含的内容超过了您的范围)。

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true }; 
if (accept[value]) { 
    // blah blah blah 
} 

接受可以从数组当然生成。真正取决于您计划使用这种模式的程度。 :/

嗯,你可以如果你使用JavaScript 1.6或更高版本使用switch语句...

switch (value) { 
    case 1 : // blah 
       break; 
    case 16 : // blah 
       break; 
    case -500 : // blah 
       break; 
    case 42.42: // blah 
       break; 
    case "something" : // blah 
        break; 
} 

,您可以使用indexOf符号阵列上:

if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) { 
    // blah 
} 

以及在hackiness最终,你可以强制的值转换为字符串(这适用于所有的浏览器):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) { 
    // blah 
} 

var value= -55; 
switch(value){ 
    case 1: case 16: case -55: case 42.5: case 'something': 
     alert(value); break;   

} 

在努力使尚未这样做的另一种方式......

if (/^(1|16|-500|42.42|something)$/.test(value)) { 
    // blah blah blah 
} 

无须扩大阵列原型或什么,只是用一个快速的正则表达式来测试值!