Skip to content
aha66 edited this page Aug 1, 2014 · 12 revisions

Simple operations:

val a = 12
val b = -a + 3
val c = b == 9

translates to

var a = 12
var b = -a + 3
var c = b == 9

Raw Javascript inclusion

javascript {
  include("var a = 5;")
}

literally includes its argument

var a = 5;

if and match expressions

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

for and for..in

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/catch/finally

try { parseInt("one") } catch {
  case e: Exception => console.log("Oops")
}

translates to

try {
  parseInt("one");
} catch(e) console.log("Oops");

Type casts

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);

Array definition

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.

Object definition

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);
  }
}

JsDynamic

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;