可视化优化串连在一起的JavaScript条件运算符

可视化优化串连在一起的JavaScript条件运算符,javascript,conditional-operator,Javascript,Conditional Operator,在JavaScript中,假设我们有以下代码 var test = 'd'; if (test != 'a' && test != 'b' && test != 'c') alert('were good to go'); 这对我来说似乎太长了。我想写一些像这样的东西 if (test != ('a' && 'b' && 'c') alert('were good to go'); 遗憾的是,这不起作用。写这篇文章的更优

在JavaScript中,假设我们有以下代码

var test = 'd';
if (test != 'a' && test != 'b' && test != 'c')
  alert('were good to go');
这对我来说似乎太长了。我想写一些像这样的东西

if (test != ('a' && 'b' && 'c')
  alert('were good to go');

遗憾的是,这不起作用。写这篇文章的更优雅的方式是什么?

你无法做到这一点,但你可以这样接近:

Array.prototype.contains = function(v) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == v) return true;
    }
    return false;
}

if (!['a', 'b', 'c'].contains('d')) {
    alert('good to go');
}
Array.prototype.contains=函数(v){
for(var i=0;i

大多数像样的JS库应该包含很多类似于这样的列表原型的变体。

你不能这样做,但你可以像这样接近:

Array.prototype.contains = function(v) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == v) return true;
    }
    return false;
}

if (!['a', 'b', 'c'].contains('d')) {
    alert('good to go');
}
var test = 'd';
if (!/[abc]/.test(test))
  alert('were good to go');
Array.prototype.contains=函数(v){
for(var i=0;i

大多数像样的JS库应该包含许多类似于这样的列表原型的变体。

一个小助手函数将带您走得更远

var test = 'd';
if (!/[abc]/.test(test))
  alert('were good to go');
// If you write this...
function set(){
    obj={}
    for (var i=0; i<arguments.length; i++)
        obj[arguments[i]]=1;  
    return obj
}

// Then you can do this!
if (! test in set('a','b','c')){
    //Do stuff.
}
//如果你写这个。。。
函数集(){
obj={}

对于(var i=0;i一个小助手函数将带您走得更远

// If you write this...
function set(){
    obj={}
    for (var i=0; i<arguments.length; i++)
        obj[arguments[i]]=1;  
    return obj
}

// Then you can do this!
if (! test in set('a','b','c')){
    //Do stuff.
}
//如果你写这个。。。
函数集(){
obj={}

对于(var i=0;i我同意Matthew Crumley的观点,即这是一个逻辑上无效的问题。为了好玩,我假设您打算在您的问题中使用&&

var test = 'd';
({a: 1, b: 1, c: 1}[ test ]) || alert("we're good to go");
或者


我同意Matthew Crumley的观点,这是一个逻辑上无效的问题,因为这是一个逻辑上无效的问题

var test = 'd';
({a: 1, b: 1, c: 1}[ test ]) || alert("we're good to go");
或者


…标准的警告是,弄乱内置的原型是一个很好的方法,以后会让你感到非常困惑。通常只是理解语言的问题。如果你刚从静态类型语言中过来,使用基于类的OO继承,那么当然,这可能会很奇怪。但在不过,我认为这要干净得多。这是Javascript的工作方式。没有理由担心修改内置对象的原型。唯一的例外是会给迭代器带来问题的对象原型……标准的警告是,弄乱内置对象的原型是一种很好的方式,以后会让自己非常困惑。通常只是理解语言的问题。如果你刚从静态类型语言开始,使用基于类的OO继承,那么当然,这可能会很奇怪。但是很容易改为函数方法。我认为这更干净。这是Javascript的工作方式。没有理由担心修改内置对象的原型对象。唯一的例外是会导致迭代器出现问题的对象原型。您是否打算使用“&&&”?在您的示例中,您可以将其简化为“if(true)”,因为测试不能同时为“a”、“b”和“c”。抱歉,是的,我打算使用&&它现在已被编辑。您是否打算使用“&&&”?在您的示例中,您可以将其简化为“if”(正确),因为测试不能同时是“a”、“b”和“c”。对不起,是的,我是想使用&它现在已经被编辑了。出于某种原因,我对in操作符有一种不合理的恐惧。正如普雷斯塔尔上面提到的,任何附加到对象原型的东西都会在其他任何东西的for/in中显示出来,所以for/in有点不好的代表性,我通常只有我们我出于某种原因对in操作符有一种不合理的恐惧。正如普雷斯塔尔上面提到的,任何附加到对象原型上的东西都会在其他东西的for/in中出现,所以for/in有一点不好的代表性,我通常只在调试时使用它。如果(!/[abc]/.test(test))?“test”这里应该比“匹配”更有效。如果(!/[abc]/.test(test))?“test”在这里应该比“匹配”更有效,为什么不呢?“test”在这里应该比“匹配”更有效。我投票支持你的解决方案。主要是因为你最终修复了警报字符串中的拼写错误。我投票支持你的解决方案。主要是因为你最终修复了警报字符串中的拼写错误。