有没有办法使用一个JavaScript在两个字符串之间切换?

我想做点什么

if(something.val() == 'string1') { something.val('string2'); } else if(something.val() == 'string2') { something.val('string1') } 

但是在一行代码中。 我不记得它是如何完成的,但它涉及问号和冒号……

尝试:

 something.val(something.val() == 'string1' ? 'string2' : 'string1'); 

它被称为三元表达式。

看马云,没有三元运营商!

以下是有效的,因为Javascript短路布尔表达式。

如果something == string1然后评估string2 – 因为string2是一个truthy值而下一个表达式涉及OR操作,所以不需要继续。 停止并返回string2

如果有something !== string1那么它将跳过下一个操作数,因为如果它是false,则评估下一个操作数(使用AND)是没有意义的。 它将“跳转”到OR操作并返回string1

 function toggleString(something, string1, string2) { return something == string1 && string2 || string1; } something.val(toggleString(something.val(), "string1", "string2")); 

如果你想完成任务:

 function toggleValue(something, string1, string2) { something.val(something.val() == string1 && string2 || string1); } toggleValue(something, "string1", "string2"); // something is a jQuery collection 

但最后,我最终会使用三元运算符,因为其他程序员可能不清楚这个解决方案。 如果你来自Java或其他语言,你可能希望函数返回一个布尔值,因为所有的布尔运算符。

如何使用@Daniel的代码和jquery函数:

 $.fn.toggleVal = function (str1, str2) { return this.val(this.val() == str1 && str2 || str1); }; $("input").toggleVal('string 1', 'string 2'); 

使用对象属性的另一种方法:

 { 'string1': 'string2', 'string2': 'string1' }[value] 

如问题所示:

 something.val( { 'string1': 'string2', 'string2': 'string1' }[something.val()] ) 

你的意思是使用三元运算符:

 something.val((something.val() == 'string1') ? 'string2' : 'string1'); 

从jQuery 1.4开始,你可以这样做:

 something.val(function(index, val) { return val == 'string1' ? 'string2' : 'string1'; }); 
  something.val( something.val() == 'string1'? 'string2' : 'string1' ); 

或澄清

 val astring = something.val() == 'string1'? 'string2' : 'string1'; something.val( astring ); 
 something.val(something.val() == 'string1' ? 'string2' : 'string1'); 

虽然,使用三元运算符的解决方案是最具可读性的,但您也可以使用Lodash中的xor:

 x = _.xor([a, b], [x])[0] 

对于您的具体情况:

 something.val(_.xor(['s1', 's2'], [something.val()])[0]); 

参考: https : //lodash.com/docs/4.17.10#xor