【问题标题】:"Complex" javascript ternarys“复杂的”javascript 三元组
【发布时间】:2014-05-01 01:04:12
【问题描述】:

参考Shorten code using Ternary Operators 中提供的答案,我想知道为什么不推荐以下三元。

$('#myID')[(myVar1 === myVar2) ? 'addClass' : 'removeClass']('myClass');

建议的答案是:

$('#myID').toggleClass('myClass', myVar1 === myVar2);

为了澄清,我理解后者更好,因为它利用第二个参数来进行切换类进行评估。我想知道的是,第一个示例是否通常不推荐,因为它的可读性或其他一些因素。还有,第一个三元有特殊的名字吗?我很好奇它是否被称为特殊的东西,以防我不得不再次搜索它。

非常感谢!

【问题讨论】:

  • IMO,第一个更难阅读和理解(需要更多思考才能识别它试图做什么)。仅供参考,第二个有问题。这工作正常:$('#myID').toggleClass('myClass', myVar1 === myVar2);
  • 这不是一个“复杂”的三元;它只是一个不需要的三元组。第一种方法很好,但它不必要地冗长,尤其是当存在像 $.fn.toggleClass 这样的方法时。对于它的价值,您的比较不需要括号。
  • 它的可读性和可读性是巨大的。另外 - 这是非常基于意见的。
  • @jfriend00 - 谢谢,修正了我的错字。我也同意可读性问题。
  • @JonathanSampson,我想不出一个类似的“切换式”代码来写我的问题。我的问题更多的是试图更好地理解第一个中看到的语法。

标签: jquery ternary-operator


【解决方案1】:

第一个示例是使用三元运算符来确定将传递给括号表示法的属性字符串。这与任何其他赋值的三元用法没有什么不同:

var argmnt = "emphasize",
    method = condition ? "addClass" : "removeClass" ;

$( selector )[ method ]( argmnt );

唯一的区别是您将三元本身放在括号内:

$( selector )[ condition ? "addClass" : "removeClass" ]( argmnt );

这确实使代码更难阅读,并且不必要地复制了另一个非常好的方法的功能:$.fn.toggleClass

我无法窥探其他人的想法,但我怀疑这就是您引用答案的作者选择更简单、更简洁的解决方案的原因。

更多关于括号符号

对象键允许比点表示法允许的更多字符和灵活性。例如,虽然first-name 是一个有效的密钥,但您不能使用像person.first-name 这样的点符号来访问它。这就是括号符号派上用场的地方:person['first-name'] 完全有效。

我们还可以使用括号表示法进行内联评估或保存变量:

var method = "addClass";
$( selector )[ method ]( argmnt );

这和写$( select ).addClass( argmnt ), but we're able to conditionally determine which method will be called:$.fn.addClass, or$.fn.removeClass`是一样的。

您也可以在访问数组中的项目时看到这种方法:

var values = [ "Stack", "Overflow" ];
el.textContent = values[ (1 + values.indexOf( el.textContent )) % values.length ];

在这里,我们也在方括号内执行临时评估,而不是将结果存储在变量中,然后将其传入。

只要您的代码简洁明了,这还不算太糟糕。但要小心,事情很快就会失控,您的代码很快就会变得难以直观地解析,从而给您自己或项目的未来开发人员维护带来问题。

【讨论】:

  • 啊啊啊啊,我明白了。感谢您花时间解释这一点。非常感谢。
  • @Jonathan Sampson 好帖子!帖子的最后一个例子很有趣。尝试了提供的示例,以及此页面上的 $("body").append("<span id=test></span>");var el = $("#test")[0]; var values = [ "Stack", "Overflow" ]; el.textContent = values[ ++values.indexOf( el.textContent ) % values.length ];var el = $("#test"); var values = [ "Stack", "Overflow" ]; $(el).text(values[ ++values.indexOf( $(el).text() ) % values.length ]); 并得到了 ReferenceError: Invalid left-hand side expression in prefix operation。请帮忙照亮。感谢分享。
  • @guest271314 很抱歉让您感到困惑;我已经用一个工作示例更新了我的代码。
  • @JonathanSampson 工作!好的!再次感谢您的分享。
猜你喜欢
  • 2019-10-27
  • 2023-01-24
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多