A table showing how each ActionScript language 'feature' is should be translated to Google Closure Tools assisted JavaScript by the FalconJS Compiler.
Using these AS3 references:
- Global Constants, Functions and Classes
- Statements, Keywords and Directives
Using Google Closure annotations:
- Annotating JavaScript for the Closure Compiler
Table quick navigation:
- coming soon ;-)
Legend for Javascript column color usage:
Black: JavaScript matches ActionScript
Red: solution not agreed upon
Blue: solution looks good, need consencus to approve (use Comments or Notes column)
Green: solution agreed upon
|
Test Available In FlexJS (+/-)? |
ActionScript |
JavaScript + Closure annotation |
Notes |
||
---|---|---|---|---|---|---|
Global Constants |
|
|
|
|
||
Infinity |
- |
Infinity |
Infinity |
|
||
-Infinity |
- |
-Infinity |
-Infinity |
|
||
NaN |
- |
NaN |
NaN |
|
||
undefined |
- |
undefined |
undefined |
|
||
|
|
|
|
|
||
Global Functions |
|
|
|
|
||
Array() |
- |
Array(...values) |
Array(...values) |
Frank's comment: https://cwiki.apache.org/confluence/display/FLEX/AS+to+JS+translation+table?focusedCommentId=30744800#comment-30744800 |
||
Boolean() |
- |
Boolean(value) |
Boolean(value) |
See "Array" function note. |
||
decodeURI() |
- |
decodeURI(value) |
decodeURI(value) |
|
||
decodeURIComponent() |
- |
decodeURIComponent(value) |
decodeURIComponent(value) |
|
||
encodeURI() |
- |
encodeURI(value) |
encodeURI(value) |
|
||
encodeURIComponent() |
- |
encodeURIComponent(value) |
encodeURIComponent(value) |
|
||
escape() |
- |
escape(value) |
escape(value) |
|
||
int() |
- |
int(value) |
(value >> 0) |
|
||
isFinite() |
- |
isFinite(value) |
isFinite(value) |
|
||
isNaN() |
- |
isNaN(value) |
isNaN(value) |
|
||
isXMLName() |
- |
isXMLName(value) |
? |
There is no matching implementation in JavaScript. We may need to build a utility function to cover this one. |
||
Number() |
- |
Number(value) |
Number(value) |
See "Array" function note. |
||
Object() |
- |
Object(value) |
Object(value) |
In ActionScript, calling 'Object(value)' returns 'value' (since all values are objects). Given that, does it make sense to just write 'value' in JavaScript and let the Closure Compiler "cast" it? |
||
parseFloat() |
- |
parseFloat(value) |
parseFloat(value) |
|
||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="c2897c5e-5f22-4df3-ab1e-73162a70a19e"><ac:plain-text-body><![CDATA[ |
parseInt() |
- |
parseInt(value, [radix]) |
parseInt(value, [radix]) |
|
]]></ac:plain-text-body></ac:structured-macro> |
String() |
- |
String(value) |
String(value) |
See "Array" function note. |
||
trace() |
- |
trace(...values) |
console.log(...values) |
We may need a utility function to wrap 'console.log', as not all browsers have debugging enable, and calling to a non-existent 'console' object will cause an error. Maybe something like Jangaroo's 'trace' implementation? |
||
uint() |
|
uint(value) |
(value >>> 0) |
|
||
unescape() |
- |
unescape(value) |
unescape(value) |
|
||
Vector() |
- |
result = Vector.<type>(valueArray); |
result = /** @type {Array.<type>} */ valueArray; |
Let the Closure Compiler handle (check) what is basically a type cast from general Array to a Typed Array. |
||
XML() |
- |
XML(value) |
? |
Use 'goog.dom.xml'? |
||
XMLList() |
|
XMLList(value) |
? |
Use 'goog.dom.xml'? |
||
|
|
|
|
|
||
Classes |
|
|
|
|
||
ArgumentError |
- |
ArgumentError |
Error |
Need utility class and cast a regular error object to that, for the sake of the Closure Compiler? |
||
arguments |
- |
arguments |
arguments |
|
||
Array |
- |
Array |
Array |
Not sure if all properties and methods of AS Array class map to the JS Array class. |
||
Boolean |
|
Boolean |
Boolean |
|
||
Class |
- |
package com.example.components { public class MyClass { public function MyClass() {} } } |
goog.provide('com.example.components.MyClass'); /** * @constructor */ com.example.components.MyClass = function() {}; |
|
||
Date |
- |
Date |
Date |
The JS class seems to be missing all the properties that the AS class offers. The methods on both classes match, AFAICT. |
||
DefinitionError |
- |
DefinitionError |
Error |
Need utility class and cast a regular Error object to that, for the sake of the Closure Compiler? |
||
Error |
- |
Error |
Error |
There is no 'errorID' property on the JS Error class |
||
EvalError |
- |
EvalError |
EvalError |
Not sure if all JS VM implementations support this... |
||
Function |
- |
Function |
Function |
|
||
int |
- |
int |
Number |
|
||
JSON |
- |
JSON |
JSON |
How about support for "older" browsers? Do we provide "if not JSON, add custom JSON to window object"? |
||
Math |
- |
Math |
Math |
|
||
Namespace |
- |
Namespace |
? |
Do we need a utility class? |
||
Number |
- |
Number |
Number |
|
||
Object |
- |
Object |
Object |
"setPropertyIsEnumerable" not available on JS Object.prototype... |
||
QName |
- |
QName |
? |
Part of the E4X implementation in AS... No such beast in JS, so maybe we look at "goog" or even a native utility class? |
||
RangeError |
- |
RangeError |
RangeError |
Not sure if all JS VM implementations support this... |
||
ReferenceError |
- |
ReferenceError |
ReferenceError |
Not sure if all JS VM implementations support this... |
||
RegExp |
- |
RegExp |
RegExp |
Does the regular expression "syntax" of both implementations match? |
||
SecurityError |
- |
SecurityError |
Error |
Need utility class and cast a regular Error object to that, for the sake of the Closure Compiler? |
||
String |
- |
String |
String |
Not sure if all properties and methods of AS String class map to the JS String class. |
||
SyntaxError |
- |
SyntaxError |
SyntaxError |
Not sure if all JS VM implementations support this... |
||
TypeError |
- |
TypeError |
TypeError |
Not sure if all JS VM implementations support this... |
||
uint |
- |
uint |
Number |
Does the Number object provide all "functionality" of an AS uint? If so, we're good, I think... |
||
URIError |
- |
URIError |
URIError |
Not sure if all JS VM implementations support this... |
||
Vector |
- |
Vector |
/** @type {Array.<type>} */ Array |
Since a Vector is "nothing more" than a typed Array, we can use Closure annotation to 'force' the Closure Compiler to treat it as such. |
||
VerifyError |
- |
VerifyError |
Error |
Need utility class and cast a regular Error object to that, for the sake of the Closure Compiler? |
||
XML |
- |
XML |
? |
Part of the E4X implementation in AS... No such beast in JS, so maybe we look at "goog" or even a native utility class? |
||
XMLList |
- |
XMLList |
? |
Part of the E4X implementation in AS... No such beast in JS, so maybe we look at "goog" or even a native utility class? |
||
|
|
|
|
|
||
Arithmetic |
|
|
|
|
||
+ |
- |
+ |
+ |
|
||
-- |
- |
-- |
-- |
|
||
/ |
- |
/ |
/ |
|
||
++ |
- |
++ |
++ |
|
||
% |
- |
% |
% |
|
||
* |
- |
* |
* |
|
||
- |
- |
- |
- |
|
||
|
|
|
|
|
||
Arithmetic compound assignment |
|
|
|
|
||
+= |
- |
+= |
+= |
|
||
/= |
- |
/= |
/= |
|
||
%= |
- |
%= |
%= |
|
||
*= |
- |
*= |
*= |
|
||
-= |
- |
-= |
-= |
|
||
|
|
|
|
|
||
Assignment |
|
|
|
|
||
= |
- |
= |
= |
|
||
|
|
|
|
|
||
Bitwise |
|
|
|
|
||
& |
- |
& |
& |
|
||
<< |
- |
<< |
<< |
|
||
~ |
- |
~ |
~ |
|
||
| |
- |
| |
| |
|
||
>> |
- |
>> |
>> |
|
||
>>> |
- |
>>> |
>>> |
|
||
^ |
- |
^ |
^ |
|
||
|
|
|
|
|
||
Bitwise compound assignment |
|
|
|
|
||
&= |
- |
&= |
&= |
|
||
<<= |
- |
<<= |
<<= |
|
||
|= |
- |
|= |
|= |
|
||
>>= |
- |
>>= |
>>= |
|
||
>>>= |
- |
>>>= |
>>>= |
|
||
^= |
- |
^= |
^= |
|
||
|
|
|
|
|
||
Comment |
|
|
|
|
||
/**/ |
- |
/**/ |
/**/ |
|
||
// |
- |
// |
// |
|
||
|
|
|
|
|
||
Comparison |
|
|
|
|
||
== |
- |
== |
== |
|
||
> |
- |
> |
> |
|
||
>= |
- |
>= |
>= |
|
||
!= |
- |
!= |
!= |
|
||
< |
- |
< |
< |
|
||
<= |
- |
<= |
<= |
|
||
=== |
- |
=== |
=== |
|
||
!== |
- |
!== |
!== |
|
||
|
|
|
|
|
||
Logical |
|
|
|
|
||
&& |
- |
&& |
&& |
|
||
&&= |
- |
x &&= y |
x = x && y |
Excellent suggestion from Fank: Keep It Simple, Stupid ;-) |
||
! |
- |
! |
! |
|
||
|| |
- |
|| |
|| |
|
||
||= |
- |
x ||= y |
x = x || y |
KISS, again. |
||
|
|
|
|
|
||
Other |
|
|
|
|
||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="8cbfae42-35da-4b72-9f05-190d58ab2b42"><ac:plain-text-body><![CDATA[ |
[] |
- |
[] |
[] |
|
]]></ac:plain-text-body></ac:structured-macro> |
as |
- |
as |
? |
I think we need a utility function |
||
, |
|
|
|
|
||
?: |
|
|
|
|
||
delete |
|
|
|
|
||
. |
|
|
|
|
||
in |
|
|
|
|
||
instanceof |
|
|
|
|
||
is |
|
|
|
|
||
:: |
|
|
|
|
||
new |
|
|
|
|
||
{} |
|
|
|
|
||
() |
|
|
|
|
||
/ |
|
|
|
|
||
: |
|
|
|
|
||
typeof |
|
|
|
|
||
void |
|
|
|
|
||
|
|
|
|
|
||
String |
|
|
|
|
||
+ |
|
|
|
|
||
+= |
|
|
|
|
||
" |
|
|
|
|
||
|
|
|
|
|
||
XML |
|
|
|
|
||
@ |
|
|
|
|
||
{} |
|
|
|
|
||
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="bff96cad-8606-4734-ad7a-92f91df0e7e3"><ac:plain-text-body><![CDATA[ |
[] |
|
|
|
|
]]></ac:plain-text-body></ac:structured-macro> |
+ |
|
|
|
|
||
+= |
|
|
|
|
||
delete |
|
|
|
|
||
.. |
|
|
|
|
||
. |
|
|
|
|
||
() |
|
|
|
|
||
<> |
|
|
|
|
||
|
|
|
|
|
||
Statements |
|
|
|
|
||
break |
|
|
|
|
||
case |
|
|
|
|
||
continue |
|
|
|
|
||
default |
|
|
|
|
||
do...while |
|
|
|
|
||
else |
|
|
|
|
||
for |
|
|
|
|
||
for...in |
|
|
|
|
||
for each...in |
|
|
|
|
||
if |
|
|
|
|
||
label |
|
|
|
|
||
return |
|
|
|
|
||
super |
|
|
|
|
||
switch |
|
|
|
|
||
throw |
|
|
|
|
||
try...catch...finally |
|
|
|
|
||
while |
|
|
|
|
||
with |
|
|
|
|
||
|
|
|
|
|
||
Attribute Keywords |
|
|
|
|
||
dynamic |
|
|
|
|
||
final |
|
|
|
|
||
internal |
|
|
|
|
||
native |
|
|
|
|
||
override |
|
|
|
|
||
private |
|
|
|
|
||
protected |
|
|
|
|
||
public |
|
|
|
|
||
static |
|
|
|
|
||
|
|
|
|
|
||
Definition keywords |
|
|
|
|
||
... (rest) parameter |
|
|
|
|
||
class |
|
|
|
|
||
const |
|
|
|
|
||
extends |
|
|
|
|
||
function |
|
|
|
|
||
get |
|
|
|
|
||
implements |
|
|
|
|
||
interface |
|
|
|
|
||
namespace |
|
|
|
|
||
package |
|
|
|
|
||
set |
|
|
|
|
||
var |
|
|
|
|
||
|
|
|
|
|
||
Directives |
|
|
|
|
||
default xml namespace |
|
|
|
|
||
import |
|
|
|
|
||
include |
|
|
|
|
||
use namespace |
|
|
|
|
||
|
|
|
|
|
||
Namespaces |
|
|
|
|
||
AS3 |
|
|
|
|
||
flash_proxy |
|
|
|
|
||
object_proxy |
|
|
|
|
||
|
|
|
|
|
||
Primary expression keywords |
|
|
|
|
||
false |
|
|
|
|
||
null |
|
|
|
|
||
this |
|
|
|
|
||
true |
|
|
|
|
||
|
|
|
|
|
||
OLD |
|
|
|
|
||
Inheriting |
|
package com.example.components{ import org.apache.flex.Button; public class MyClass extends Button { public function MyClass() { super(); } } } |
goog.provide('com.example.components.MyClass'); goog.require('org.apache.flex.Button'); /** * @constructor * @extends {org.apache.flex.Button} */ com.example.components.MyClass = function() { goog.base(this); }; goog.inherits(com.example.components.MyClass, org.apache.flex.Button); |
|
||
Implementing |
|
TBD |
TBD |
|
||
Inheriting + Implementing |
|
TBD |
TBD |
|
||
|
|
|
|
|
||
Fields |
|
|
|
|
||
private |
|
private var _myVar:String = ""; |
Inside the constructor function: /** * @private * @type {string} */ this._myVar = ''; |
|
||
protected |
|
This is how far I got today ;-) |
|
|
||
public |
|
|
|
|
||
Global Constants |
|
|
|
|