2009-07-23 10 views
0

stringed En JavaScript disons que nous avons le code suivantvisuellement Optimisation JavaScript Les opérateurs conditionnels qui sont ensemble

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

Ce si me semble assez longue pour. J'aimerais écrire quelque chose comme

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

Malheureusement, cela ne fonctionne pas. Quelle est une manière plus élégante d'écrire ceci?

+3

Vouliez-vous dire utiliser "&&"? Dans votre exemple, vous pouvez le simplifier à "if (true)", car test ne peut pas être "a", "b" et "c" en même temps. –

+0

Désolé, oui je voulais utiliser && il a été édité maintenant – Splashlin

Répondre

2
var test = 'd'; 
if (!/[abc]/.test(test)) 
    alert('were good to go'); 
+0

Pourquoi pas si (!/[Abc] /. Test (test))? "test" devrait être plus efficace ici que "match". – Prestaul

+0

Oui, test() fonctionne aussi! Merci –

2

Vous ne pouvez pas vous faire cela, mais vous pouvez obtenir assez près comme ceci:

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'); 
} 

plus décents JS libs devrait contenir beaucoup de variations sur des prototypes de liste comme celle-ci.

+0

... avec la mise en garde standard que déconner avec les prototypes de builtins est un bon moyen de se confondre horriblement plus tard. –

+0

Habituellement, il suffit de comprendre la langue. Si vous venez d'un langage statiquement typé, avec l'héritage OO basé sur la classe, alors, cela peut être étrange. Mais il est facile de passer à une approche de fonction à la place. Je pense que c'est beaucoup plus propre cependant. C'est comme ça que fonctionne Javascript. – Svend

+0

Il n'y a aucune raison de craindre de modifier les prototypes d'objets intégrés. La seule exception est le prototype Object qui provoque des problèmes pour les itérateurs. – Prestaul

0

Une petite fonction d'aide vous amène loin ...

// 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. 
} 
+0

J'ai une sorte de peur irrationnelle de l'opérateur in, pour une raison quelconque. – Jimmy

+0

Comme Prestaul mentionne ci-dessus, tout ce qui est attaché au prototype d'objet apparaîtra dans un for/in de toute autre chose, donc pour/in, a un peu un mauvais représentant, et je l'utilise habituellement pour le débogage. – Svend

1

Je suis d'accord avec Matthew Crumley que c'est une question logiquement invalide, tel quel. Pour le plaisir, je vais supposer que vous vouliez dire utiliser & & dans votre question ...

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

ou ..

var test = 'd'; 
!(test in {a: 0, b: 0, c: 0}) && alert("we're good to go"); 
+0

Je vote pour votre solution. Principalement parce que vous avez finalement corrigé la faute de frappe dans la chaîne d'alerte. – Nosredna