在 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 中的真实性很棘手。例如,空字符串与 null
和 undefined
一样虚假。因此,您的两个示例并不等效。根据您的描述,我希望第二个更正确。你的要求,有点证明真实性是危险的。
你的第二个片段很好。如果你真的在与一个使用 null
和 undefined
的库交互(这已经很可疑了,即使对于 JS 也是如此;通常它是一个 或另一个,但不是两者),那么我建议你定义一个小的辅助函数:
def fromJSWithNullOrUndefined[A](x: js.UndefOr[A]): Option[A] =
x.toOption.filter(_ != null)
编码了 null
和 undefined
都应映射到 None
的所有特殊行为,然后按如下方式使用它:
val c = fromJSWithNullOrUndefined(getString()).getOrElse(fallback())
Scala 开发人员会发现这比开始时的 ||
代码更具可读性。它更加地道。
在 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 中的真实性很棘手。例如,空字符串与 null
和 undefined
一样虚假。因此,您的两个示例并不等效。根据您的描述,我希望第二个更正确。你的要求,有点证明真实性是危险的。
你的第二个片段很好。如果你真的在与一个使用 null
和 undefined
的库交互(这已经很可疑了,即使对于 JS 也是如此;通常它是一个 或另一个,但不是两者),那么我建议你定义一个小的辅助函数:
def fromJSWithNullOrUndefined[A](x: js.UndefOr[A]): Option[A] =
x.toOption.filter(_ != null)
编码了 null
和 undefined
都应映射到 None
的所有特殊行为,然后按如下方式使用它:
val c = fromJSWithNullOrUndefined(getString()).getOrElse(fallback())
Scala 开发人员会发现这比开始时的 ||
代码更具可读性。它更加地道。