在 Scala.js 中使用 JS 值真实性的最佳方法是什么?

What's the best way to use the truthiness of a JS value in Scala.js?

在 JavaScript 中,写

这样的东西很容易(而且清晰)
var a = getString(); // say, some string, possibly null or undefined
var b = fallback(); // fallback value
var c = a || b;

在 Scala.js 中,我可以做得比这更好以具有相同的语义吗?

val a: UndefOr[String] = getString()
val b: String = fallback()
val c = a.filter(_ != null).getOrElse(b)

JS 中的真实性很棘手。例如,空字符串与 nullundefined 一样虚假。因此,您的两个示例并不等效。根据您的描述,我希望第二个更正确。你的要求,有点证明真实性是危险的。

你的第二个片段很好。如果你真的在与一个使用 null undefined 的库交互(这已经很可疑了,即使对于 JS 也是如此;通常它是一个 另一个,但不是两者),那么我建议你定义一个小的辅助函数:

def fromJSWithNullOrUndefined[A](x: js.UndefOr[A]): Option[A] =
  x.toOption.filter(_ != null)

编码了 nullundefined 都应映射到 None 的所有特殊行为,然后按如下方式使用它:

val c = fromJSWithNullOrUndefined(getString()).getOrElse(fallback())

Scala 开发人员会发现这比开始时的 || 代码更具可读性。它更加地道。