【问题标题】:Test for existence and correct value on an if statement测试 if 语句的存在和正确值
【发布时间】:2013-05-22 21:31:37
【问题描述】:

使用 JavaScript 或 CoffeeScript,是否有一种简单的方法来测试以下内容:

if (locals.messages.text === "somestring") { ... }

现在这需要满足三个条件:locals 需要存在,locals.messages 需要存在并且它需要等于 "somestring"

如果locals.messages 不存在,则抛出TypeEror cannot read text of undefined

我知道我可以做到:

if (!!locals && !!locals.messages && locals.messages.text == "somestring) {...}

但是太长了,有没有办法:

  1. locals.messages.text 存在的文本
  2. 检查值是否等于某个值?

使用javascript或coffeescript工作

【问题讨论】:

  • 你可以用 try/catch 做到这一点
  • 对我来说,“测试是否存在”意味着locals 无法解析(ReferenceError)。这是询问当中间节点可能评估为未定义时如何深度查询对象图路径。 (仅 JavaScript 的解决方案几乎没有那么漂亮。)

标签: javascript if-statement coffeescript operators


【解决方案1】:

在 CoffeeScript 中,您可以使用“Existential Operator”的访问器变体,大致如下:

locals?.messages?.text == 'somestring'

http://coffeescript.org/

这编译为(为清楚起见进行了分解,但实际上不再可读):

(typeof locals !== "undefined" && locals !== null 
    ? (_ref = locals.messages) != null 
        ? _ref.text 
        : void 0 
    : void 0)
    === 'somestring'

存在运算符?. 的访问器变体可用于吸收属性链中的空引用。在基值可能为 null 或未定义的情况下,使用它代替点访问器 .。如果所有属性都存在,那么您将得到预期的结果,如果链被破坏,则返回 undefined 而不是否则会引发的 TypeError。

不确定它是否满足您的精确要求,但可能就足够了。

【讨论】:

  • +1 在 Coffeescript 中看起来不错,但编译成一些非常丑陋的 Javascript
  • @Xotic750 当然,转编译器通常会输出你不会手写的代码。
猜你喜欢
  • 2012-07-01
  • 2018-10-31
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多