SlideShare a Scribd company logo
Stuff You Didn't Know
 About ActionScript


      Christophe Herreman
           @herrodius
... or an exploration of the ActionScript 3 language in which
you might discover new things that you were not aware of
and that one day might come in handy, or in which you will
want to scream out WTF's so loud that the whole venue
might think I'm presenting naked whilst in reality you are just
looking at a piece of ActionScript code that is so counter-
intuitive or looks rather puzzling you wonder how anyone
came up with the idea to implement certain parts of the API
this way, which on the other hand makes the language also
very fun to work with once you know how to deal with these
peculiarities and it becomes clear that ActionScript is
actually pretty cool and powerful ...
About me
Run Stack & Heap, a development, consulting and training
company based in Belgium specializing in Web / RIA
Development

Certified expert Flex with AIR, loved Flash since 1999

Founder of Spring ActionScript and AS3Commons

Apache Flex committer
Operators
Equality "=="
Checks if 2 values are equal, and applies data conversion if
the values have different data types.

"hello" == "hello"            // true
"5" == 5                      // true
true == 1                     // true
false == 0                       // true
"true" == true                // false
null == undefined             // true
Strict Equality "==="
Checks if 2 values and their types are equal.

"hello" === "hello"           // true
"5" === 5                     // compile error
true === 1                       // false
false === 0                   // false
"true" === true                  // false
null === undefined            // false
Equality "=="
Complex data types are compared by reference, not value.

var a:Array = [1, 2, 3];
var b:Array = [1, 2, 3];

a == b      // false

var c:Array = a;

a == c      // true
Conditional "?:"
Known as the Ternary Operator.

var result:Boolean = (a > b) ? x : y;

// shorthand for

var result:Boolean;
if (a > b) {
   result = x;
} else {
   result = y;
}
Logical OR "||="
function (a:Object) {
   a ||= new Object();
}

// shorthand for

function (a:Object) {
   if (a === null) {
      a = new Object();
   }
}
Logical AND "&&="
function toHTMLTag (s:String) {
   s &&= "<" + s + ">";
   return s;
}

// shorthand for

function toHTMLTag (s:String) {
   if (s !== null && (s.length > 0))
      s = "<" + s + ">";
   return s;
}
"as"
Casts a value to another data type, returning null if the cast
fails.

"hello" as String           // "hello"
5 as String                 // null
true as MyClass                // null

String("hello")                // "hello"
String(5)                   // "5"
MyClass(true)               // Runtime Error
"is" vs "instanceof"
Check if a value is of a certain data type.

var s:Sprite = new Sprite();

s is Sprite                    // true
s is DisplayObject             // true
s is IEventDispatcher          // true

s instanceof Sprite           // true
s instanceof DisplayObject    // true
s instanceof IEventDispatcher // false
"::" name qualifier
Identifies the namespace of an object.

public namespace Dutch;
public namespace French;

Dutch function hello():String {
   return "hallo";
}

French function hello():String {
   return "bonjour";
}
"::" name qualifier

Dutch::hello()    // "hallo"
French::hello()      // "bonjour"
"::" name qualifier
"public", "private", "protected", "internal"
are also namespaces.

public function get a():String;
private function set a(value:String);

trace(a)       // compile error
a = "hello"    // compile error

trace(public::a)
private::a = "hello"
"in" vs Object.hasOwnProperty
Check if an object contains a certain
property.

"CASEINSENSITIVE" in Array              //   true
"CASEINSENSITIVE" in []                 //   false
"length" in Array                       //   true
"length" in []                          //   true

[].hasOwnProperty("CASEINSENSITIVE") // false
[].hasOwnProperty("length")          // true
"arguments"
An array available in each function that contains the
arguments passed to the function.
function myFunction (x:int) {
   for(var i:uint=0; i<arguments.length; i++){
     trace(arguments[i]);
   }
}
myFunction(1, 2, 3);
// 1
// 2
// 3
"..." Rest Arguments
Pass an arbitrary number of extra arguments to a function.

function myFunction (x:int, ... rest) {
   for (var i:uint = 0; i< rest.length; i++) {
     trace(rest[i]);
   }
}

myFunction(1, 2, 3);
// 2
// 3
Tips & Tricks
Object creation
var a:Array = new Array();
var a:Array = [];              // faster

var o:Object = new Object();
var o:Object = {};             // faster

var v:Vector.<String> = new Vector.<String>();
v.push("a");
v.push("b");

var v:Vector.<String> = new <String>["a", "b"];
Object References
var a:Object = {};
a.name = "John";

var b:Object = a;
b.name = "Elvis";

trace(a.name);       // output "Elvis"
Object Copies
Create deep or shallow copies depending on
the scenario.

// deep copy

private function clone(obj:Object):Object {
   var bytes:ByteArray = new ByteArray();
   bytes.writeObject(obj);
   bytes.position = 0;
   return bytes.readObject();
}
Events
Always override the "clone" method in an Event subclass.
Prevents runtime type coercion errors when redispatching.

class MyEvent extends Event {
   public function MyEvent(data:Object){
     _data = data;
   }
   override public function clone():Event {
     return new MyEvent(_data);
   }
}
for...in vs. for each...in
var arr:Array = ["a", "b", "c"];

// loops through keys (0, 1, 2)
for ( var i in arr ) {
   trace( i );
}

// loop through values ("a", "b", "c")
for each ( var s:String in arr ) {
   trace( s );
}

Gotcha: order is not guaranteed, use for loop with counter
trace()
You can pass multiple arguments to the trace() method. No
need to compose a string.

trace(new Date(2012, 4, 22), "Aloha", Math.PI, true);

// Tue May 22 00:00:00 GMT+0200 2012 Aloha 3.141592653589793
true
Labeled Loops
Use "label" on a loop to name it. Useful when breaking from
nested loops.

mainLoop:
for (var i:uint = 0; i<10; i++) {
   for (var j:uint = 0; j<10; j++) {
       if (i == 5 && j == 7) {
          break mainLoop;
       }
   }
}
Global Functions
Declare a single function in an *.as file and name the file the
same as the function.

// in file: myGlobalFunction.as
package {
   function myGlobalFunction():void {
     trace("in myGlobalFunction");
   }
}
Adding Methods to Built-in Classes
Extend the behavior of built-in classes by adding methods to
the prototype.

Array.prototype.removeItem = function (item:*):void {
   var index:int = this.indexOf(item);
   if (index > -1) {
       this.splice(index, 1);
   }
};

var a:Array = [1, 2, 3];
a.removeItem(2);
trace(a); // 1, 3
Gotchas
   &
 WTF's
Casting
var o:MyObject = new MyObject();
var o1:MyObject = MyObject(o);
var o2:MyObject = o as MyObject; // o1 === o2

var a:Array = [1, 2, 3];
var a1:Array = Array(a);   // new Array !!!
var a2:Array = a as Array; // a1 !== a2

Also the case with Date and Error classes. Watch out!
Casting to Boolean
Boolean(true)        // true
Boolean(false)       // false
Boolean(0)              // false
Boolean(1)              // true
Boolean(-1)          // true
Boolean("true")      // true
Boolean("false")     // true
Boolean("")          // false
Boolean(" ")         // true
Boolean("0")         // true
Boolean("1")         // true
Boolean(null)        // false
Boolean(undefined)   // false
Boolean(Object)      // true
Boolean({})          // true
Array class
var a:Array = new Array();       // empty array
var a:Array = [];                   // empty array

var a:Array = new Array(10);     // array with length 10
var a:Array = [10];              // array with 1 element: 10

var a:Array = new Array(1, 2, 3); // array with values 1, 2,
3
var a:Array = [1, 2, 3];          // array with values 1, 2,
3
Date class
new   Date();                // current date
new   Date(2012);               // 01/01/1970 01:00:
02
new   Date(2012, 1);    // 01/02/2012 00:00:00
new   Date(2012, 1, 1); // 01/02/2012 00:00:00

public function Date(
   yearOrTimevalue:Object,
   month:Number,             // 0 to   11
   date:Number = 1,             // 1   to 31
   hour:Number = 0,             // 0   to 23
   minute:Number = 0,        // 0 to   59
   second:Number = 0,        // 0 to   59
   millisecond:Number = 0)   // 0 to   999
Throwing Parties
You can throw more than just errors.

class AwesomeParty {}

try {
   throw new AwesomeParty();
} catch (party:AwesomeParty) {
   // go loose at moNo!
}

Practical use?
More info
ActionScript 3 Language Reference
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/


ActionScript 3 Language Specification
http://livedocs.adobe.com/specs/actionscript/3/


Twitter
@herrodius, @stackandheap

Stack & Heap Labs
http://labs.stackandheap.com
Questions ?
Thank you !

More Related Content

PDF
Proxies are Awesome!
PDF
LetSwift RxSwift 시작하기
PDF
Google guava
PDF
Swift internals
PDF
RxSwift 활용하기 - Let'Swift 2017
PPTX
5 Tips for Better JavaScript
ODP
ES6 PPT FOR 2016
PPTX
Hardened JavaScript
Proxies are Awesome!
LetSwift RxSwift 시작하기
Google guava
Swift internals
RxSwift 활용하기 - Let'Swift 2017
5 Tips for Better JavaScript
ES6 PPT FOR 2016
Hardened JavaScript

What's hot (20)

DOCX
What are arrays in java script
PDF
Object Oriented JavaScript
PDF
Swift 함수 커링 사용하기
PPTX
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
KEY
Exhibition of Atrocity
PPTX
Ian 20150116 java script oop
PPTX
JavaScript 1 for high school
PDF
A swift introduction to Swift
PDF
Clean code with google guava jee conf
KEY
Why Learn Python?
PPT
JavaScript Arrays
PDF
Powerful JavaScript Tips and Best Practices
ODP
EcmaScript 6
PPT
JavaScript Tutorial
PDF
JavaScript 101 - Class 1
PPTX
PDF
JavaScript ES6
PDF
Swift 2
PDF
Google Guava
PDF
JavaScript Design Patterns
What are arrays in java script
Object Oriented JavaScript
Swift 함수 커링 사용하기
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Exhibition of Atrocity
Ian 20150116 java script oop
JavaScript 1 for high school
A swift introduction to Swift
Clean code with google guava jee conf
Why Learn Python?
JavaScript Arrays
Powerful JavaScript Tips and Best Practices
EcmaScript 6
JavaScript Tutorial
JavaScript 101 - Class 1
JavaScript ES6
Swift 2
Google Guava
JavaScript Design Patterns
Ad

Viewers also liked (13)

PPTX
Top 10 WordPress Logo Showcase Plugins 2016
PPT
講演資料|生活者視点が鍵となるオウンドメディアマーケティング
PPTX
WordPress or Drupal : Which is better ?
PPTX
Effective logo slider plugins are here
PDF
野菜でつながる学菜Project第6回ミーティング
PDF
Boletín 30/01/2017
PDF
150622 教育評価論 第10講(課題解決評価)
PDF
Šéf robot naša budúcnosť
PPTX
Keri Jaehnig - Graphic Resume
PDF
Otrova Gomas - El jardín de los inventos
PDF
БЮЛЛЕТЕНЬ НАУКИ И ПРАКТИКИ (BULLETIN OF SCIENCE AND PRACTICE) № 7
PDF
Otrova Gomas - El hombre más malo del mundo
PPT
13. sürrealism
Top 10 WordPress Logo Showcase Plugins 2016
講演資料|生活者視点が鍵となるオウンドメディアマーケティング
WordPress or Drupal : Which is better ?
Effective logo slider plugins are here
野菜でつながる学菜Project第6回ミーティング
Boletín 30/01/2017
150622 教育評価論 第10講(課題解決評価)
Šéf robot naša budúcnosť
Keri Jaehnig - Graphic Resume
Otrova Gomas - El jardín de los inventos
БЮЛЛЕТЕНЬ НАУКИ И ПРАКТИКИ (BULLETIN OF SCIENCE AND PRACTICE) № 7
Otrova Gomas - El hombre más malo del mundo
13. sürrealism
Ad

Similar to Stuff you didn't know about action script (20)

PPTX
Js types
PPT
Ajax and JavaScript Bootcamp
KEY
JavaScript Neednt Hurt - JavaBin talk
PPT
Javascript
PDF
JavaScript for PHP developers
PPTX
Javascript basics
PPTX
Typescript barcelona
PPTX
Javascript 101
PPT
Wakanday JS201 Best Practices
PPTX
LinkedIn TBC JavaScript 100: Intro
PDF
PDF
Static types on javascript?! Type checking approaches to ensure healthy appli...
DOC
Jsphp 110312161301-phpapp02
PPTX
Java script
PDF
05 JavaScript #burningkeyboards
PDF
Fewd week5 slides
PDF
ES6 - Next Generation Javascript
PDF
Swift Programming Language
PDF
Internal workshop es6_2015
Js types
Ajax and JavaScript Bootcamp
JavaScript Neednt Hurt - JavaBin talk
Javascript
JavaScript for PHP developers
Javascript basics
Typescript barcelona
Javascript 101
Wakanday JS201 Best Practices
LinkedIn TBC JavaScript 100: Intro
Static types on javascript?! Type checking approaches to ensure healthy appli...
Jsphp 110312161301-phpapp02
Java script
05 JavaScript #burningkeyboards
Fewd week5 slides
ES6 - Next Generation Javascript
Swift Programming Language
Internal workshop es6_2015

More from Christophe Herreman (7)

PDF
De kathedraal en de bazaar
PDF
How to build an AOP framework in ActionScript
PPTX
PPT
AS3Commons Introduction
PPTX
Spring Actionscript at Devoxx
PPT
Spring ActionScript
PPT
The Prana IoC Container
De kathedraal en de bazaar
How to build an AOP framework in ActionScript
AS3Commons Introduction
Spring Actionscript at Devoxx
Spring ActionScript
The Prana IoC Container

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Modernizing your data center with Dell and AMD
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Approach and Philosophy of On baking technology
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Advanced IT Governance
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPT
Teaching material agriculture food technology
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Machine learning based COVID-19 study performance prediction
PDF
Electronic commerce courselecture one. Pdf
PDF
Spectral efficient network and resource selection model in 5G networks
Cloud computing and distributed systems.
Review of recent advances in non-invasive hemoglobin estimation
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Modernizing your data center with Dell and AMD
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Per capita expenditure prediction using model stacking based on satellite ima...
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Approach and Philosophy of On baking technology
Unlocking AI with Model Context Protocol (MCP)
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Advanced IT Governance
Chapter 3 Spatial Domain Image Processing.pdf
Empathic Computing: Creating Shared Understanding
Teaching material agriculture food technology
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Machine learning based COVID-19 study performance prediction
Electronic commerce courselecture one. Pdf
Spectral efficient network and resource selection model in 5G networks

Stuff you didn't know about action script

  • 1. Stuff You Didn't Know About ActionScript Christophe Herreman @herrodius
  • 2. ... or an exploration of the ActionScript 3 language in which you might discover new things that you were not aware of and that one day might come in handy, or in which you will want to scream out WTF's so loud that the whole venue might think I'm presenting naked whilst in reality you are just looking at a piece of ActionScript code that is so counter- intuitive or looks rather puzzling you wonder how anyone came up with the idea to implement certain parts of the API this way, which on the other hand makes the language also very fun to work with once you know how to deal with these peculiarities and it becomes clear that ActionScript is actually pretty cool and powerful ...
  • 3. About me Run Stack & Heap, a development, consulting and training company based in Belgium specializing in Web / RIA Development Certified expert Flex with AIR, loved Flash since 1999 Founder of Spring ActionScript and AS3Commons Apache Flex committer
  • 5. Equality "==" Checks if 2 values are equal, and applies data conversion if the values have different data types. "hello" == "hello" // true "5" == 5 // true true == 1 // true false == 0 // true "true" == true // false null == undefined // true
  • 6. Strict Equality "===" Checks if 2 values and their types are equal. "hello" === "hello" // true "5" === 5 // compile error true === 1 // false false === 0 // false "true" === true // false null === undefined // false
  • 7. Equality "==" Complex data types are compared by reference, not value. var a:Array = [1, 2, 3]; var b:Array = [1, 2, 3]; a == b // false var c:Array = a; a == c // true
  • 8. Conditional "?:" Known as the Ternary Operator. var result:Boolean = (a > b) ? x : y; // shorthand for var result:Boolean; if (a > b) { result = x; } else { result = y; }
  • 9. Logical OR "||=" function (a:Object) { a ||= new Object(); } // shorthand for function (a:Object) { if (a === null) { a = new Object(); } }
  • 10. Logical AND "&&=" function toHTMLTag (s:String) { s &&= "<" + s + ">"; return s; } // shorthand for function toHTMLTag (s:String) { if (s !== null && (s.length > 0)) s = "<" + s + ">"; return s; }
  • 11. "as" Casts a value to another data type, returning null if the cast fails. "hello" as String // "hello" 5 as String // null true as MyClass // null String("hello") // "hello" String(5) // "5" MyClass(true) // Runtime Error
  • 12. "is" vs "instanceof" Check if a value is of a certain data type. var s:Sprite = new Sprite(); s is Sprite // true s is DisplayObject // true s is IEventDispatcher // true s instanceof Sprite // true s instanceof DisplayObject // true s instanceof IEventDispatcher // false
  • 13. "::" name qualifier Identifies the namespace of an object. public namespace Dutch; public namespace French; Dutch function hello():String { return "hallo"; } French function hello():String { return "bonjour"; }
  • 14. "::" name qualifier Dutch::hello() // "hallo" French::hello() // "bonjour"
  • 15. "::" name qualifier "public", "private", "protected", "internal" are also namespaces. public function get a():String; private function set a(value:String); trace(a) // compile error a = "hello" // compile error trace(public::a) private::a = "hello"
  • 16. "in" vs Object.hasOwnProperty Check if an object contains a certain property. "CASEINSENSITIVE" in Array // true "CASEINSENSITIVE" in [] // false "length" in Array // true "length" in [] // true [].hasOwnProperty("CASEINSENSITIVE") // false [].hasOwnProperty("length") // true
  • 17. "arguments" An array available in each function that contains the arguments passed to the function. function myFunction (x:int) { for(var i:uint=0; i<arguments.length; i++){ trace(arguments[i]); } } myFunction(1, 2, 3); // 1 // 2 // 3
  • 18. "..." Rest Arguments Pass an arbitrary number of extra arguments to a function. function myFunction (x:int, ... rest) { for (var i:uint = 0; i< rest.length; i++) { trace(rest[i]); } } myFunction(1, 2, 3); // 2 // 3
  • 20. Object creation var a:Array = new Array(); var a:Array = []; // faster var o:Object = new Object(); var o:Object = {}; // faster var v:Vector.<String> = new Vector.<String>(); v.push("a"); v.push("b"); var v:Vector.<String> = new <String>["a", "b"];
  • 21. Object References var a:Object = {}; a.name = "John"; var b:Object = a; b.name = "Elvis"; trace(a.name); // output "Elvis"
  • 22. Object Copies Create deep or shallow copies depending on the scenario. // deep copy private function clone(obj:Object):Object { var bytes:ByteArray = new ByteArray(); bytes.writeObject(obj); bytes.position = 0; return bytes.readObject(); }
  • 23. Events Always override the "clone" method in an Event subclass. Prevents runtime type coercion errors when redispatching. class MyEvent extends Event { public function MyEvent(data:Object){ _data = data; } override public function clone():Event { return new MyEvent(_data); } }
  • 24. for...in vs. for each...in var arr:Array = ["a", "b", "c"]; // loops through keys (0, 1, 2) for ( var i in arr ) { trace( i ); } // loop through values ("a", "b", "c") for each ( var s:String in arr ) { trace( s ); } Gotcha: order is not guaranteed, use for loop with counter
  • 25. trace() You can pass multiple arguments to the trace() method. No need to compose a string. trace(new Date(2012, 4, 22), "Aloha", Math.PI, true); // Tue May 22 00:00:00 GMT+0200 2012 Aloha 3.141592653589793 true
  • 26. Labeled Loops Use "label" on a loop to name it. Useful when breaking from nested loops. mainLoop: for (var i:uint = 0; i<10; i++) { for (var j:uint = 0; j<10; j++) { if (i == 5 && j == 7) { break mainLoop; } } }
  • 27. Global Functions Declare a single function in an *.as file and name the file the same as the function. // in file: myGlobalFunction.as package { function myGlobalFunction():void { trace("in myGlobalFunction"); } }
  • 28. Adding Methods to Built-in Classes Extend the behavior of built-in classes by adding methods to the prototype. Array.prototype.removeItem = function (item:*):void { var index:int = this.indexOf(item); if (index > -1) { this.splice(index, 1); } }; var a:Array = [1, 2, 3]; a.removeItem(2); trace(a); // 1, 3
  • 29. Gotchas & WTF's
  • 30. Casting var o:MyObject = new MyObject(); var o1:MyObject = MyObject(o); var o2:MyObject = o as MyObject; // o1 === o2 var a:Array = [1, 2, 3]; var a1:Array = Array(a); // new Array !!! var a2:Array = a as Array; // a1 !== a2 Also the case with Date and Error classes. Watch out!
  • 31. Casting to Boolean Boolean(true) // true Boolean(false) // false Boolean(0) // false Boolean(1) // true Boolean(-1) // true Boolean("true") // true Boolean("false") // true Boolean("") // false Boolean(" ") // true Boolean("0") // true Boolean("1") // true Boolean(null) // false Boolean(undefined) // false Boolean(Object) // true Boolean({}) // true
  • 32. Array class var a:Array = new Array(); // empty array var a:Array = []; // empty array var a:Array = new Array(10); // array with length 10 var a:Array = [10]; // array with 1 element: 10 var a:Array = new Array(1, 2, 3); // array with values 1, 2, 3 var a:Array = [1, 2, 3]; // array with values 1, 2, 3
  • 33. Date class new Date(); // current date new Date(2012); // 01/01/1970 01:00: 02 new Date(2012, 1); // 01/02/2012 00:00:00 new Date(2012, 1, 1); // 01/02/2012 00:00:00 public function Date( yearOrTimevalue:Object, month:Number, // 0 to 11 date:Number = 1, // 1 to 31 hour:Number = 0, // 0 to 23 minute:Number = 0, // 0 to 59 second:Number = 0, // 0 to 59 millisecond:Number = 0) // 0 to 999
  • 34. Throwing Parties You can throw more than just errors. class AwesomeParty {} try { throw new AwesomeParty(); } catch (party:AwesomeParty) { // go loose at moNo! } Practical use?
  • 35. More info ActionScript 3 Language Reference http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/ ActionScript 3 Language Specification http://livedocs.adobe.com/specs/actionscript/3/ Twitter @herrodius, @stackandheap Stack & Heap Labs http://labs.stackandheap.com