SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
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 !

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

What are arrays in java script
What are arrays in java scriptWhat are arrays in java script
What are arrays in java script
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
Swift 함수 커링 사용하기
Swift 함수 커링 사용하기Swift 함수 커링 사용하기
Swift 함수 커링 사용하기
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of Atrocity
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
 
JavaScript 1 for high school
JavaScript 1 for high schoolJavaScript 1 for high school
JavaScript 1 for high school
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to Swift
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee conf
 
Why Learn Python?
Why Learn Python?Why Learn Python?
Why Learn Python?
 
JavaScript Arrays
JavaScript Arrays JavaScript Arrays
JavaScript Arrays
 
Powerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesPowerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best Practices
 
EcmaScript 6
EcmaScript 6 EcmaScript 6
EcmaScript 6
 
JavaScript Tutorial
JavaScript  TutorialJavaScript  Tutorial
JavaScript Tutorial
 
JavaScript 101 - Class 1
JavaScript 101 - Class 1JavaScript 101 - Class 1
JavaScript 101 - Class 1
 
Using the Windows 8 Runtime from C++
Using the Windows 8 Runtime from C++Using the Windows 8 Runtime from C++
Using the Windows 8 Runtime from C++
 
JavaScript ES6
JavaScript ES6JavaScript ES6
JavaScript ES6
 
Swift 2
Swift 2Swift 2
Swift 2
 
Google Guava
Google GuavaGoogle Guava
Google Guava
 
JavaScript Design Patterns
JavaScript Design PatternsJavaScript Design Patterns
JavaScript Design Patterns
 

Destaque

野菜でつながる学菜Project第6回ミーティング
野菜でつながる学菜Project第6回ミーティング野菜でつながる学菜Project第6回ミーティング
野菜でつながる学菜Project第6回ミーティング
SHINLINE Co., Ltd.
 
Šéf robot naša budúcnosť
Šéf robot naša budúcnosťŠéf robot naša budúcnosť
Šéf robot naša budúcnosť
Peter Ulcin
 

Destaque (14)

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

Semelhante a Stuff you didn't know about action script

JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 
LinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: IntroLinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: Intro
Adam Crabtree
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 

Semelhante a Stuff you didn't know about action script (20)

Js types
Js typesJs types
Js types
 
Ajax and JavaScript Bootcamp
Ajax and JavaScript BootcampAjax and JavaScript Bootcamp
Ajax and JavaScript Bootcamp
 
JavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talkJavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talk
 
Javascript
JavascriptJavascript
Javascript
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
Javascript basics
Javascript basicsJavascript basics
Javascript basics
 
Typescript barcelona
Typescript barcelonaTypescript barcelona
Typescript barcelona
 
Javascript 101
Javascript 101Javascript 101
Javascript 101
 
jQuery introduction
jQuery introductionjQuery introduction
jQuery introduction
 
Wakanday JS201 Best Practices
Wakanday JS201 Best PracticesWakanday JS201 Best Practices
Wakanday JS201 Best Practices
 
LinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: IntroLinkedIn TBC JavaScript 100: Intro
LinkedIn TBC JavaScript 100: Intro
 
Js hacks
Js hacksJs hacks
Js hacks
 
Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
 
Java script
Java scriptJava script
Java script
 
05 JavaScript #burningkeyboards
05 JavaScript #burningkeyboards05 JavaScript #burningkeyboards
05 JavaScript #burningkeyboards
 
Fewd week5 slides
Fewd week5 slidesFewd week5 slides
Fewd week5 slides
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
Swift Programming Language
Swift Programming LanguageSwift Programming Language
Swift Programming Language
 

Mais de Christophe Herreman (7)

De kathedraal en de bazaar
De kathedraal en de bazaarDe kathedraal en de bazaar
De kathedraal en de bazaar
 
How to build an AOP framework in ActionScript
How to build an AOP framework in ActionScriptHow to build an AOP framework in ActionScript
How to build an AOP framework in ActionScript
 
GradleFX
GradleFXGradleFX
GradleFX
 
AS3Commons Introduction
AS3Commons IntroductionAS3Commons Introduction
AS3Commons Introduction
 
Spring Actionscript at Devoxx
Spring Actionscript at DevoxxSpring Actionscript at Devoxx
Spring Actionscript at Devoxx
 
Spring ActionScript
Spring ActionScriptSpring ActionScript
Spring ActionScript
 
The Prana IoC Container
The Prana IoC ContainerThe Prana IoC Container
The Prana IoC Container
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 

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