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]
}
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]
}