I've mentioned in my previous posts that Haxe and Javascript (well more Typescirot) are very similar syntax wise. However, if you've come from javascript to Haxe you'll notice a few odd things with the syntax that don't make sense.
The creator of Haxe tried to keep to language as simple as possible even though you can do some really complex things with it if you've come from C# some of these might make sense, but for js devs, there are a few weird differences. I've listed some below.
1 - Constructors methods
This was quite confusing to me at first but the more I wrote in Haxe the more it's implementation made sense.
// Javascript
class MyAwesomeClass {
constructor() {
// Stuff to initialize
}
}
// Haxe
class MyAwesomeClass {
public function new() {
// Stuff to initialize
}
}
2 - All variables are var (well almost)
Again I would have to agree with the Haxe way on this. Javascript gets a bit confusing when creating variables, especially in classes. Sometimes you use this
, sometimes you can use var
, let
or const
depending on if you want a constant scoped variable or not, and sometimes, you don't write anything. In Haxe you only need to remember one keyword var
.
// Javascript
class MyAwesomeClass {
outsideMethod;
constructor() {
this.outsideMethod = 10;
}
myAwesomeMethod() {
const constantInsideMethod = 15;
let insideMethod = 10;
}
}
// Haxe
class MyAwesomeClass {
var outsideMethod:Int;
public function new() {
outsideMethod = 10;
}
function myAwesomeMethod() {
final constantInsideMethod:Int = 15;
var insideMethod:Int = 10;
}
}
3. The overwrite keyword
Overriding an inherited method is something I've never done in javascript but do quite often in Haxe so I'm not sure if the js example I've written below will work.
// Javascript
class MySecondAwesomeClass extends MyAwesomeClass {
myAwesomeMethod() {
var newVariable = 200;
super.myAwesomeMethod();
}
}
// Haxe
class MySecondAwesomeClass extends MyAwesomeClass {
override myAwesomeMethod() {
var newVariable:Int = 200;
}
}
4. Package instead of export
This is a really small change that you probably would have figured out without this article but I'll put it here nevertheless.
// Javascript
export default class MySecondAwesomeClass extends MyAwesomeClass {
myAwesomeMethod() {
var newVariable = 200;
super.myAwesomeMethod();
}
}
// Haxe
package; // This should be the first line in the file
class MySecondAwesomeClass extends MyAwesomeClass {
override myAwesomeMethod() {
var newVariable:Int = 200;
}
}
5. Different array methods
There are probably loads other default methods that are different in Haxe and Javascript but the array methods, in my opinion, are used a lot so it's good to know they're slightly different in Haxe.
// Typescript
class MyThirdAwesomeClass {
testArrayMap():Array<number> {
var myArray:Array<number> = [0, 1, 2];
return myArray.map(function(number:number, index:number) {
return number + index;
});
}
}
// Haxe
// the mapi method won't work without adding using Lambda outside of this class
class MyThirdAwesomeClass {
function testArrayMap():Array<Int> {
var myArray:Array<Int> = [0, 1, 2];
return myArray.mapi(function(Index:Int, Number:Int) {
return Number + Index;
});
}
}
6. The Using keyword
This is what I meant by the using keyword in the previous example. There's only a Haxe example for this one because you can't do it in Javascript.
// Haxe
using Lambda;
class MyThirdAwesomeClass {
function testArrayMap():Array<Int> {
var myArray:Array<Int> = [0, 1, 2];
return myArray.mapi(function(Index:Int, Number:Int) {
return Number + Index;
});
}
}
It's a bit difficult to explain if you haven't used it before but essentially if you have created a static method in one class and want to use it in another there are two ways you could do it this way.
import Lambda;
// usage
Lambda.mapi(myArray, ...)
Or this way:
using Lambda
// usage
myArray.mapi(...)
If you import with using
the static method can be applied directly to the variable as if it's a method that belongs to it.
7. For Loops
There's a pretty cool way of doing incrementing for loops kind of with the spread syntax in javascript.
// Javascript
for (let i = 0; i < 10; i++) {
console.log(i);
}
// Haxe
for (i in 0...9) {
trace(i);
}
There's also a cool little shorthand you can do with Haxe"
// Haxe
for (i in 0...9) trace(i);
8. Arrow functions
There were introduced properly in Haxe 4 (same as the final
keyword) so you won't see it in many of the examples online, it's slightly different from Javascripts implementation but not massively.
// Javascript
() => console.log("Arrow function in Javascript");
// Haxe
() -> trace("Arrow function in Haxe");
- Destructuring I really love this feature in Javascript and do it whenever I can, sadly there isn't an easy way to do this in Haxe :(
// Javascript
const obj = { id: 1, name: 'Fizz'};
const {id, name} = obj;
console.log(id);
console.log(name);
// Haxe
final obj = { id: 1, name: 'Fizz'};
var newId;
var newName;
switch obj {
case { id: newId, name: newName }:
trace(newId);
trace(newName);
}
- The spread operator Again this is something I love using in Javascripts that once again doesn't have an equivalent in Haxe 4.
// Javascript
const arr1 = [0, 1, 2];
arr1 = [...arr1, 3, 4, 5];
console.log(arr1);
//Haxe
final arr1 = [0, 1, 2];
final arr2 = [3, 4, 5];
final newArr = arr1.concat(arr2);
trace(newArr);
Conclusion
So as you can see there are loads of similarities between Haxe and Javascript syntax wise, (also Haxe and Actionscript, and Java/C#). But there are a few small things that might trip you up if you're coming from JS. Hopefully, this article will help you out with that.
Sources
http://adireddy.github.io/haxe/keywords/never-inline-keywords
https://stackoverflow.com/questions/25424247/constants-in-haxe/26906874#26906874
Top comments (1)
Nice comparison! As for the mapi method, In Haxe you can also use a shorthand notation for this: (using array comprehension and the key-value iterator)