Idiomatic Sc​​ala.js JavaScript短路评估的翻译

时间:2016-09-05 04:02:36

标签: scala.js

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

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

在Scala.js中写这个的惯用方法是什么?

2 个答案:

答案 0 :(得分:3)

相反@ 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]
}

答案 1 :(得分:1)

我认为你最好不要考虑常规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
  }

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