Almost 5 years ago I wrote a piece about the specialities of the JavaScript language for developers knowing Java. A lot has happened since then. The old (EcmaScript Standard Version 5) way is still working but some of the rough edges has been eased out.
Almost 5 years ago I wrote a piece about the specialities of the JavaScript language for developers knowing Java. A lot has happened since then. The old (EcmaScript Standard Version 5) way is still working but some of the rough edges has been eased out.
I want to concentrate on two areas: (variable) declaration and their scope and object/class creation.
Declaration
Now JavaScript has new ways to declare variables. The old var still works and declares a variable with a function scope:
function f() {
var a = 2;
var b = 1;
if (a > b) {
var a = 5;
alert(a); // 5
}
alert(a); // 5
}
But since ES6 (also known as ES 2015) you can use let to declare a variable with block scope.
function f() {
let a = 2;
let b = 1;
if (a > b) {
let a = 5;
alert(a); // 5!
}
alert(a); // 2!
}
You can also use const to create a constant, but must assign it in the same line.
const i = 5;
i = 3; // TypeError: Assignment to constant variable
const b; // SyntaxError: Missing initializer in const declaration
It is not the same as final which you can declare and initialize in different lines:
final int i = 5;
i = 3; // error!
final b; // that's ok
b = 3;
b = 4; // error
Also beware that const declares a constant, not necessarily an immutable object:
const a = [5, 3];
a[0] = 3; // ok!
Object creation
Now this is the part where the JavaScript syntax changed a lot. The old functional way is still working but now you can declare a class in a more Java-ish way:
class Person {
constructor(name) {
this.name = name;
}
}
You can also use a var:
var Person = class {
constructor(name) {
this.name = name;
}
};
Methods can be declared as well:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
fullName() { // getter!
return this.firstName + ' ' + this.lastName;
}
}
var p = new Person('John', ''Doe);
alert(p.fullName());
You can also use property getters to sugarcode the access code:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() { // getter!
return this.firstName + ' ' + this.lastName;
}
}
var p = new Person('John', ''Doe);
alert(p.fullName); // <-- just called like a property, not a method
Static methods are also streamlined:
class Factory {
static antiqueStyleNames(firstName, birthplace) {
return new Person(firstName, 'of ' + birthplace);
}
}
Inheritance, although still prototypical, can be done with extends:
class A extends B {
constructor(a) {
super();
}
m() {
super.n();
}
}
JavaScript only supports single inheritance but mixins are now possible:
var mixin = Base => class extends Base {
a() {return 1; }
};
class B {}
class A extends mixin(B) {}
alert(new A().a()); // 1!
There are many more things in modern JavaScript like arrow functions, spread and rest operators and many more. JavaScript is evolving (Java also) so even if you are mainly located in the Javaland, it pays off to take a look at JavaScript from time to time.