【问题标题】:How do I use the CoffeeScript existential operator to check some object properties for undefined?如何使用 CoffeeScript 存在运算符检查某些对象属性是否未定义?
【发布时间】:2012-04-16 22:06:45
【问题描述】:

我想使用 CoffeeScript 存在运算符来检查某些对象属性是否未定义。但是,我遇到了一个小问题。

这样的代码:

console.log test if test?

编译为:

if (typeof test !== "undefined" && test !== null) console.log(test);

这是我希望看到的行为。但是,当我尝试对对象属性使用它时,如下所示:

console.log test.test if test.test?

我得到了类似的东西:

if (test.test != null) console.log(test.test);

这看起来根本不像是对 undefined 的检查。我可以实现与将其用于对象相同的 (1:1) 行为的唯一方法是使用更大的检查:

console.log test.test if typeof test.test != "undefined" and test.test != null

问题是 - 我做错了什么吗?或者编译后的代码是否足以检查属性的存在(带有类型转换的空检查)?

【问题讨论】:

  • @Bergi,这个问题是四年前提出的,另一个是两年前。另一个不是重复的吗? :)
  • 对,我只是觉得另一个人的答案更好。我想他们应该合并。

标签: coffeescript existential-operator


【解决方案1】:

疯狂猜测;你试过console.log test.test if test?.test?吗?

刚刚用coffee -p -e 'console.log test.test if test?.test?' 对其进行了测试,编译为:

(函数() {

if ((typeof test !== "undefined" && test !== null ? test.test : void 0) != 空) { 控制台.log(test.test); }

}).call(this);

【讨论】:

  • 这真的很有用,也是我最终回答这个问题的原因,所以投票赞成吧!使 if 语句更加简洁。
【解决方案2】:

这是与存在运算符混淆的常见点:有时

x?

编译成

typeof test !== "undefined" && test !== null

其他时候它只是编译成

x != null

两者是等价的, 因为当xnullundefined 时,x != null 将是false。所以x != null 是表达(x !== undefined && x !== null) 的更简洁的方式。发生typeof 编译的原因是编译器认为x 可能根本没有定义,在这种情况下进行相等性测试会触发ReferenceError: x is not defined

在您的特定情况下,test.test 可能具有值 undefined,但您无法通过引用现有对象上的未定义属性来获得 ReferenceError,因此编译器选择较短的输出。

【讨论】:

  • 谢谢!对于我们这些在 Coffeescript 之前避免使用 Javascript 的人来说,简洁且信息丰富:)
【解决方案3】:

这个 JavaScript:

a.foo != null

实际上会检查afoo 属性是否既不是undefined 也不是null。请注意,a.foo? 被转换为使用 != null 而不是 !== null 的 JavaScript。 != 所做的转换意味着这两个都是真的:

null == null
undefined == null

一个普通的a? 变成了这个JavaScript:

typeof a !== "undefined" && a !== null

因为要检查三个条件:

  1. 范围内是否有a
  2. a 的值是否为undefined
  3. a 的值是否为null

第一个条件很重要,因为如果在范围内没有a,则说a != null 将触发ReferenceError,但说typeof a === 'undefined' 不会。 typeof 检查还处理 2 中的 a === undefined 条件。然后我们可以通过严格的 a !== null 测试来完成它,因为它可以处理 3 而不会造成不必要的 != 的性能损失(注意:!=== 比 @ 慢987654348@ 和 === 由于隐式转换)。

阅读一下!=!== 所做的事情可能会有所收获:

MDN: Comparison Operators


就您对已删除答案的评论而言,if(a.foo) 是完全有效的语法 如果您完成了 if 语句:

if(a.foo)
    do_interesting_things()
# or
do_interesting_things() if(a.foo)

但是,if(a.foo)if(a.foo?) 在处理 0false'' 的方式上有所不同。

【讨论】:

  • 谷歌上的第一个结果;但实际上 !== 返回错误。我们能澄清一下吗?
  • @Ben:不知道你的意思,!== 的用途是什么返回错误,错误是什么?
  • coffeescript-rails (coffeescript 2.2.0), "SyntaxError: [stdin]:37:38: unexpected =";一个不错的 500 错误,它只是无法在比较元素中使用第三个字符进行编译
  • @Ben 你想在 CoffeeScript 中使用!==?那是一个 JavaScript 运算符,CoffeeScript 的 != 在 JavaScript 中被转换为 !==
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 2020-05-21
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
相关资源
最近更新 更多