-
Notifications
You must be signed in to change notification settings - Fork 25
Simple Expressions
aha66 edited this page Aug 1, 2014
·
12 revisions
val a = 12
val b = -a + 3
val c = b == 9
translates to
var a = 12
var b = -a + 3
var c = b == 9
javascript {
include("var a = 5;")
}
literally includes its argument
var a = 5;
In Scala if
and match
are expressions when in javascript those are statements. JScala correctly translates if/match
expressions to Javascript statements in case of val/var
definitions:
val a = 5
val b = if (a > 2) 1 else 2
val c = b match {
case 1 => true
case _ => false
}
val d = if (a > 2) { do1(); do2(); 1} else { do2(); do1(); 2 }
translates to
var a = 5;;
var b = a > 2 ? 1 : 2;
var c;
switch(b) {
case 1: c = true; break;
default: c = false; break;
}
var d;
if (a > 2) {
do1(); do2(); d = 1;
} else {
do2(); do1(); d = 2;
}
val a = Array(1, 2)
for (i <- 0 until a.length) {
console.log(a(i))
}
for (i <- 0 to a.length) {
console.log(a(i))
}
for (j <- a) console.log(i)
forIn(a) { i => print(i) }
translates to
var a = [1, 2];
for (var i = 0; i < a.length; ++i) console.log(a[i]);
for (var i = 0; i <= a.length; ++i) console.log(a[i]);
for (var iIdx = 0, i = a[iIdx]; iIdx < a.length; i = a[++iIdx]) console.log(i);
for (i in a) print(i);
try { parseInt("one") } catch {
case e: Exception => console.log("Oops")
}
translates to
try {
parseInt("one");
} catch(e) console.log("Oops");
val a = "test".asInstanceOf[JString].charCodeAt(0)
val b = "test".as[JString].charCodeAt(0)
will produce
var a = "test".charCodeAt(0);
var b = "test".charCodeAt(0);
Scala Array
and all Seq
factories are translated into Javascript array literals:
val a = Array(1, 2)
val b = JArray(1, 2)
val c = Seq(1, 2)
val d = ArrayBuffer(1, 2)
val e = new Array[Int](256)
d(0) = a(1)
b.push(c.length)
translates to
var a = [1, 2];
var b = [1, 2];
var c = [1, 2];
var d = [1, 2];
var e = [];
d[0] = a[1];
b.push(c.length);
Class JArray
implements Javascript Array
interface.
Scala anonymous classes that extend AnyRef are translated into Javascript objects:
val a = new {
val field = 1
def foo(n: String) = parseInt(n)
}
translates to
var a = {
field : 1,
foo: function(n) {
return parseInt(n);
}
}
You can define a JsDynamic
object and call whatever you want on it.
val $ = new JsDynamic {}
class XmlHttpRequest(s: String) extends JsDynamic
javascript {
val a = new XmlHttpRequest("request")
a.foo("reply")
$("button", this).click(() => $("p").css("color", "red"))
$.field = $.select
}
translates to
var a = new XmlHttpRequest("request");
a.foo("reply");
$("button", this).click((function () {
$("p").css("color", "red");
}));
$.field = $.select;