【问题标题】:Expressions in JavaScript Ternary Operator and JSLintJavaScript 三元运算符和 JSLint 中的表达式
【发布时间】:2011-09-09 02:05:00
【问题描述】:

我最近收到一篇关于 JSLint 的博客文章的评论,询问为什么 JSLint 会抛出以下错误:

s === "test" ? MyFunc() : MyFunc2();

产生的错误是:

"期望一个赋值或函数 调用,而是看到了一个表达式。”

显然,JSLint 在这里期待一个分配,更像是:

var y = (s === "test") ? MyFunc() : MyFunc2();

但是,我并没有真正看到第一个示例的问题。三元运算符真的只能用于赋值吗?

我在JSLint.com 上看不到任何东西,在 JavaScript: The Good Parts 一书中也没有任何明显的东西。并且,社区forkJSHint也报了同样的错误。

有人吗?

【问题讨论】:

    标签: javascript ternary-operator jslint jshint


    【解决方案1】:

    这是一种表达方式。相当于写

    0 === 1;

    您正在编写的表达式会立即产生副作用并且被认为是不好的。

    通常,表达式是没有副作用的无用语句。简单地做被认为是更好的形式

    if (s === "test") {
      MyFunc();
    } else {
      MyFunc2();
    }
    

    除此之外,它的语法非常可靠。我个人确实同意写一个简洁的三元组来代替if 是不好的,你最好只用它来分配。

    已经(ab)用于简洁的其他简写表达

    someCondition && doMagic(magic);
    someCondition || doMagic(magic);
    

    如果仅用作表达式,则再次将它们视为不良形式,因为使用它们只会掩盖逻辑并使代码维护变得更加困难。

    JSHint 对此有一个选项 expr。见ticket

    跑步:

    /*jshint
      expr: true
    */
    
    var s, MyFunc, MyFunc2;
    s === "test" ? MyFunc() : MyFunc2();
    0 === 1;
    

    会通过

    【讨论】:

    • +1 来自强大的 Raynos 的回答。我必须承认,我有时使用速记表达式而不是 if 语句。不过很少是三元的,通常类似于match && doSomethingWith(match)。但这只是因为我很懒 :P 总的来说,我确实认为 JSLint 抱怨的一些事情在个人喜好发挥作用时可以忽略。
    • @Andy E:我意识到 JSLint 的某些部分确实发挥了个人偏好,但也有兴趣看到 JSHint 也报告了相同的消息。不过,知道总是很好。
    • @JamesWiseman JSHint 允许您进行很多的自定义。有一个expr 选项可以禁止这些警告。在我看来,简单的||&&? 都可以使用,但我知道它们为什么不好。
    • 现在有吗?有趣的。感谢您的回复:-)
    • @Raynos: Your writing an expression that has immediate side effects and thats considered bad. 你能澄清一下这个说法吗?什么是即时副作用?不过答案很好!
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2019-09-03
    • 2011-03-11
    • 2019-02-10
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多