* JS has no distinction between integer and float.
Object/Record
JavaScript
Reason
no static types
type point = {x: int, mutable y: int}
{x: 30, y: 20}
Same *
point.x
Same
point.y = 30;
Same
{...point, x: 30}
Same
Array
JavaScript
Reason
[1, 2, 3]
[|1, 2, 3|]
myArray[1] = 10
Same
[1, "Bob", true] *
(1, "Bob", true)
No immutable list
[1, 2, 3]
* We can simulate tuples in JavaScript with arrays, because JavaScript arrays can contain multiple types of elements.
Null
JavaScript
Reason
null, undefined
None *
* Again, only a spiritual equivalent; Reason doesn't have nulls, nor null bugs! But it does have an option type for when you actually need nullability.
let myFun = (x, y) => {
let doubleX = x + x;
let doubleY = y + y;
doubleX + doubleY
};
Currying
JavaScript
Reason
let add = a => b => a + b
let add = (a, b) => a + b
Both JavaScript and Reason support currying, but Reason currying is built-in and optimized to avoid intermediate function allocation & calls, whenever possible.
* Gives good compiler warning that data might not be of length 2. Switch to pattern-matching instead.
Loop
JavaScript
Reason
for (let i = 0; i <= 10; i++) {...}
for (i in 0 to 10) {...}
for (let i = 10; i >= 0; i--) {...}
for (i in 10 downto 0) {...}
while (true) {...}
Same
JSX
JavaScript
Reason
<Foo bar=1 baz="hi" onClick={bla} />
Same
<Foo bar=bar />
<Foo bar /> *
<input checked />
<input checked=true />
No children spread
<Foo>...children</Foo>
* Argument punning!
Exception
JavaScript
Reason
throw new SomeError(...)
raise(SomeError(...))
try {a} catch (Err) {...} finally {...}
try (a) { | Err => ...} *
* No finally.
Blocks
In Reason, "sequence expressions" are created with {} and evaluate to their last statement. In JavaScript, this can be simulated via an immediately-invoked function expression (since function bodies have their own local scope).
JavaScript
Reason
let res = (function() {
const x = 23;
const y = 34;
return x + y;
})();