Skip to content
Alexander Nemish edited this page Aug 13, 2013 · 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
}

translates to

var a = 5;;
var b;
if (a > 2) b = 1; else b = 2;
var c;
switch(b) {
  case 1: c = true; break;
  default: c = false; break;
}

for and for..in

val a = Array(1, 2)
for (i <- 0 until a.length) {
  console.log(a(i))
}
for (j <- a) console.log(i)

translates to

var a = [1, 2];
for (var i = 0; i < a.length; i++) console.log(a[i]);
for (j in a) console.log(j);

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)
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];
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 filed = 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;
Clone this wiki locally