【问题标题】:Test variable value against multiple literals or variables针对多个文字或变量测试变量值
【发布时间】:2016-12-20 08:33:04
【问题描述】:

javascript 是否提供语法糖来一次将变量与一组文字和变量进行比较?

if (x !== foo || x !== bar) 很乏味,我想要像if (<< x !== foo || bar >>) 这样的分类器版本

我知道我可以使用 switch 语句,但我正在寻找内联且不那么冗长的东西

【问题讨论】:

  • 除非x == foo == bar,此条件始终为真。你是说(x !== foo && x !== bar) 吗?
  • 为什么要陈述显而易见的问题而不是回答问题?我想在 x 两者都不是的情况下返回。无论如何,这只是一个占位符条件
  • 如果“糖”是为了让事情看起来更好,我认为没有更好的方法。如果它是关于最少字符的,它更像是一个 codegolf.stackexchange.com 问题,所以让游戏开始吧......

标签: javascript syntax ecmascript-6


【解决方案1】:

你可以这样做:

if ([foo, bar].indexOf(x) === -1) {
    ....
}

【讨论】:

    【解决方案2】:

    你可以这样做

    ![foo,bar].includes(x) && doSomething();
    

    【讨论】:

    • 对于那些需要支持 IE 的人来说,如果没有 polyfill,这将无法工作:-(
    • @mcgraphix 是的,对.. 但是问题上有ecmascript-6 标签,所以我认为也值得给出这个解决方案。
    【解决方案3】:

    你可以创建自己的比较函数,这里是 ES6 语法:

    function isNot(v, ...a) {
      return a.indexOf(v) == -1;
    }
    
    var x, foo = 123, bar = 456;
    
    x = 456;
    console.log(isNot(x, foo, bar));
    
    x = 789;
    console.log(isNot(x, foo, bar));

    或者您甚至可以创建新的原型方法。例如数字:

    Number.prototype.notIn = function(...a) {
      return a.indexOf(this.valueOf()) == -1;
    }
    
    var x, foo = 123, bar = 456;
    
    x = 456;
    console.log(x.notIn(foo, bar));
    
    x = 789;
    console.log(x.notIn(foo, bar));

    注意:对于不支持 ES6 的浏览器,您可能希望在 arguments 上使用 for 循环迭代。

    【讨论】:

    • 如果你使用 ES6 (Array.from),你不妨使用function isNot(v, ...a) {
    • @loganfsmyth - 非常真实!答案相应更新。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多