UnityScript versus JavaScript

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
(Assignment cannot be an expression)
Line 35: Line 35:
  
 
c.announce(); // prints  "I am a car."</javascript><!--</unityscript>-->
 
c.announce(); // prints  "I am a car."</javascript><!--</unityscript>-->
 +
 +
== One variable declaration at a time ==
 +
 +
JavaScript supports multiple variable declarations in one <code>var</code> statement.
 +
<javascript>var x = 3, y = 4;</javascript>
 +
UnityScript does not.
  
 
== Assignment cannot be an expression ==
 
== Assignment cannot be an expression ==

Revision as of 18:30, 10 April 2011

Contents

JavaScript is class-free

JavaScript has no classes. This is because it's a prototypal language, and not a classical one. Inheritance happens with [more dynamic] objects, rather than [unchanging] classes. <javascript>function Machine(x) {

  this.kind = ["bulldozer", "lathe", "car"][x];

}

var c = new Machine(2); print(typeof c.announce); // "undefined"

Machine.prototype.announce = function() {

  print("I am a "+this.kind+".");

};

print(typeof c.announce); // "function" c.announce(); // prints "I am a car."</javascript>

As shown above, in JavaScript, a function can create an object, when called with the new keyword. After that happens, the prototype (template) object Machine can be extended to provide additional functionality, and all class instances, past and future, are affected by this extension.

UnityScript has classes, and functions cannot create objects as in JavaScript. Extension is therefore impossible. However, there is the added benefit of being an easier-to-read, more familiar (to most) language.

<javascript>class Machine {

  var kind : String;
  function Machine(x : int) {
     this.kind = ["bulldozer", "lathe", "car"][x];
  }
  function announce() {
     print("I am a "+this.kind+".");
  }

}

print(typeof Machine.prototype); // undefined

var c = new Machine(2);

c.announce(); // prints "I am a car."</javascript>

One variable declaration at a time

JavaScript supports multiple variable declarations in one var statement. <javascript>var x = 3, y = 4;</javascript> UnityScript does not.

Assignment cannot be an expression

In JavaScript, assignment is treated as an expression.

<javascript>var x = 3; // x is 3 var y = (x=x+2); // x is 5, y is 5</javascript>

In Unity, assignment is always a statement, so this must be broken up into steps. <javascript>var x = 3; // x is 3

 // var y = (x=x+2); // Error!

x = x + 2; // x is 5 var y = x; // y is 5</javascript>

The exceptions are the [pre/post]-[in/de]crement operations: <javascript>var x = 3; var y = x++; // x is 4, y is 3

x = 3; var z = ++x; // x is 4, z is 4</javascript>

No Global Variables

Every top-level variable in JavaScript is global. Additionally, any variable declaration not preceded by the var statement is global. This is not the case in UnityScript, as every object-owned .js file is essentially wrapped in a class JSFileName {...} block. The absent-var behavior is avoided by the language prohibiting missing var keywords.

By extension, there is no global object, so the this keyword will always point to the innermost object's instance, in contrast to JS's this keyword, which will sometimes point to the global object.

Dynamic typing is inefficient

This code is valid in both UnityScript and JavaScript: <javascript>var x; x = 3;</javascript> However, it is inefficient in UnityScript because it causes x to be dynamically typed. For faster runtime execution, use one of the two static typing syntaxes. <javascript>var x = 3; // type `int` is inferred, typed statically</javascript>

<javascript>var x : int; // typed statically x = 3;</javascript>

Privacy

In JavaScript, privacy is rather unconventional.

<javascript>function Person() { // (this is the *JavaScript* way of doing privacy)

  var secret = "I am a mass murderer."; // private
  this.speak = function() { print("Don't make me tell you my secret! "+secret); }; // prints secret

} var bob = new Person(); print(bob.secret); // undefined bob.speak(); // prints "Don't make me tell you my secret! I am a mass murderer."</javascript>

In UnityScript, it can be more intuitive.

<javascript>class Person { // UnityScript only; impossible in JavaScript

  private var secret : String;
  function Person() {
     secret = "I am a mass murderer.";
  }
  function speak() {
     print("Don't make me tell you my secret! "+secret);
  }

}

var bob = new Person(); print(bob.secret); // undefined bob.speak(); // prints "Don't make me tell you my secret! I am a mass murderer."</javascript>

No Bling

Dollar signs ($) are not allowed in UnityScript identifiers as they are in JS identifiers. (In JS, the symbol is often used for c-style namespacing or as the name of a do-everything function.)

<javascript>var lib$cosine = 3; // ERROR! in UnityScript</javascript>

No with statement

There is no with statement in UnityScript. This is probably for the best, as JavaScript's with statement causes the whole language to be slower, regardless of whether the statement is used or not. It is also considered harmful.

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox