JavaScript 短路评估的惯用 Scala.js 翻译

Idiomatic Scala.js translation of JavaScript short circuit evaluation

JavaScript short-circuit evaluation 通常用于例如处理浏览器不兼容问题:

var scrollPosition =
  window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0

Scala.js 中的惯用写法是什么?

我认为你最好用普通的 scala 来思考这个问题。

特别是,如果您依赖于将 0 强制转换为布尔值,这本身不是一种不好的做法,而是因为您尽可能少地依赖隐式强制转换,最好是在它不改变语义类型。

我会以更具表现力的方式重写你的作业

var scrollPosition =
  if (window.pageYoffset > 0) {
    window.pageYoffset
  } else if (document.documentElement.scrollTop > 0) {
    document.documentElement.scrollTop
  } else if (document.body.scrollTop > 0) {
    document.body.scrollTop
  } else {
    0
  }

我可以使用匹配案例或赋予意义使其更具表现力 中间步骤。

相反@gurghet 的回答,IMO 最惯用的版本是将 JavaScript 的惯用语直接采用到 Scala.js 中。毕竟,无论如何,您都在利用 JavaScript 的动态特性,因此您最好明确说明。您可以使用 js.Dynamic:

import scala.scalajs.js
import js.Dynamic.{global => g}

def scrollPosition: Double = {
  import js.DynamicImplicits._ // to "write JavaScript"
  val pos = g.window.pageYOffset || g.document.documentElement.scrollTop || g.document.body.scrollTop || 0
  pos.asInstanceOf[Double]
}