2010-02-15 22 views
33

So che entrambe le lingue provengono dallo stesso standard ECMA-262. Sembra che i due stiano diventando molto simili con JavaScript aggiungendo listener di eventi per istanze di oggetti core tramite metodi come freeze e seal in EMCAScript-262 5th edition e così via. Mi stavo chiedendo quali sono le differenze?Quali sono le differenze chiave tra JavaScript e ActionScript 3?

+3

Non proprio lo stesso standard. AS-3 proviene dall'ormai morto ECMAScript 4 (a.k.a. Javascript 2.0), e il Javascript che vediamo ora proviene principalmente da ECMAScript 3. – kennytm

risposta

31

Prima di tutto ActionScript 3 e JavaScript sono entrambi definiti in ECMA-262 quindi hanno molto in comune. Entrambe le lingue presentano l'ereditarietà del prototipo, ad esempio. Tuttavia, non è corretto che ActionScript implementa completamente ES4.

ActionScript implementa un paio di funzionalità che non sono definite in ECMA-262 e alcune - ma sicuramente non tutte - di ES4.

Così che cosa AS3 aggiungi a ECMA-262?Queste sono anche le differenze a JavaScript:

  • in modo dinamico e codice a tipizzazione statica
  • Pacchetti, classi e interfacce
  • standard del modello OO eredità (non prototipo basato, tipizzazione statica)
  • uint e int tipo di dati
  • E4X (ECMA-357)
  • Compilazione condizionale di tipo sicuro (ES4)
  • Vettore. <T> datatype (ES4)

Forse ho dimenticato alcune funzionalità. Non sono sicuro che XML, XMLList ecc. Siano già definiti in 262 o siano stati inclusi in 357.

La differenza chiave tuttavia è la libreria standard. JavaScript viene fornito con un paio di classi predefinite come DOMElement e aggiunte dipendenti dal browser. ActionScript ha una libreria standard abbastanza ampia con funzionalità come lo streaming video ed è coerente su tutte le piattaforme.

5

Uno è di tipo Safetly. Actionscript richiede che tu imposti un tipo per tutti gli oggetti, e JavaScript non lo faccia (in questo caso, in JavaScript, una variabile può essere di un tipo e quindi immediatamente impostata su un altro tipo).

Actionscript è orientato agli oggetti. Sebbene sia possibile avere questo in JavaScript, Actionscript consente l'ereditarietà degli oggetti, ecc.

+0

proprio come AS2 (yay!) –

+7

Esiste l'ereditarietà in Javascript. Questa è l'eredità del prototipo. – kennytm

+2

No, non è necessario digitare un riferimento a un oggetto in ActionScript. Fai lo stesso come in JavaScript: var x = ... –

12

Ho programmato sia in ActionScript che in Javascript e, da un punto di vista meno tecnico, vedo due differenze principali.

1) JavaScript è più potente. Ti è permesso fare molto di più con il linguaggio perché non ha un "compilatore" o tipi. Ci sono alcuni ottimi framework come ExtJS e jQuery che provano e semplificano le cose per te, ma anche con loro, puoi davvero fare una quantità incredibile di danni se lo desideri.

2) ActionScript è molto più limitato e quindi molto più semplice da gestire. Adobe ha fatto un sacco di lavoro per tenerti fuori dalle parti difficili di ECMAScript. Oggetti ECMAScript, eredità prototipale e chiusure sono tre concetti che non è necessario comprendere per programmare in ActionScript. Hai solo bisogno di capire come usare l'oggetto "Classe" di Adobe.

Per utilizzi semplici, preferisco JavaScript. Tuttavia, una volta che il progetto diventa grande, dipende da chi stai codificando. Se avessi un team di 5 programmatori che programmano su uno scrappy start-up, sceglierei JavaScript in un batter d'occhio. Tuttavia, nella corporatura di una grande azienda, o in un mondo accademico, potresti essere più sicuro affidandoti alla piattaforma di Adobe.

Spero che questo aiuti.

+3

* "Per usi semplici, preferisco JavaScript." * Scusa? Pensavo che ActionScript non potesse essere usato al di fuori di Flash. – kennytm

+0

È vero, non può. Mi dispiace se lo sottintevo. La metà del motivo per cui utilizzerei JavaScript per piccoli progetti è perché l'utente non avrebbe bisogno di gestire il flash. – Stephano

+0

Buoni punti Stephano. Apprezzo le informazioni. – Chin

4

In sostanza, la differenza principale che trovo è che ActionScript è più un linguaggio prolisso tipicamente basato sulla classe dove come javascript è un linguaggio prototipo.

Sfortunatamente in ActionScript non è presente un'inferenza di tipo, quindi l'utilizzo di Flex Builder avverte ogni volta che si lascia qualcosa non tipizzato che trovo non necessario e eccessivamente prolisso, non solo lo rende più dettagliato di javascript ma trovo il codice equivalente a essere più prolisso di C#.

Tuttavia, la verbosità aggiuntiva presenta miglioramenti di rendimento e sicurezza di tipo extra in fase di compilazione. Purtroppo questo si aggiunge anche il tempo per costruire in modo significativo, in apps Java Script di qualsiasi dimensione sono abituato a un feedback immediato mentre il mio ultimo progetto ActionScript avuto tempo di costruzione superiore a 2 minuti.

3

Le differenze principali sono che ActionScript 3 supporta sia l'ereditarietà basato su classi e l'ereditarietà prototipale, impone attacchi namespace tra i nomi di classe e nomi di file, e non supporta alcuni metodi JavaScript globali come eval. Fortunatamente, puoi fare diverse cose per colmare il divario.

È possibile impostare a livello globale utilizzando lo spazio dei nomi ES per ECMAScript o AS3 per ActionScript 3:

use namespace ES; 
use namespace AS3; 

Se si utilizza lo spazio dei nomi di AS3, qualsiasi metodo di sostituzione deve utilizzare lo spazio dei nomi AS3 e l'attributo override.

Se non si utilizza lo spazio dei nomi AS3, è possibile utilizzare i metodi del prototipo e propertyIsEnumerable.

È possibile utilizzare in modo selettivo la versione AS3 spazio dei nomi di una proprietà o di un metodo in una funzione dinamica:

var nums:Array = new Array(1, 2, 3); 
nums.AS3::pop(); 
trace(nums); // output: 1,2 

Per disattivare l'ereditarietà base di classe, è anche possibile utilizzare le seguenti opzioni del compilatore: compc -as3=false -strict=false -es=true

import * 
class foo 
    { 
    dynamic function foo() 
    { 

    } 
    } 

Se non si utilizza lo spazio dei nomi AS3, un'istanza di una classe principale eredita le proprietà e i metodi definiti nell'oggetto prototipo .

Se si decide di utilizzare lo spazio dei nomi AS3, un'istanza di una classe principale eredita le proprietà e i metodi definiti nella definizione della classe.

ecco un caratteristiche comuni tra ECMAScript-4 e ECMAScript-2017 o successivi:

 
Feature 		 ES4/ES6+ 	ES4 Only      
Rest parameter 		 ☑ 
Destructuring 		 ☑ 
ByteArrays 		 ☑ 
Class 		 	 ☑ 
Interface 		 		 ☑ 
Static fields 		 		 ☑ 
Parameter default 	 ☑ 
Rest Parameters 	 ☑ 
Bound methods 		 		 ☑ 
dynamic this value 			 ☑ 
multiple catch clauses 			 ☑ 
short-circuit-and (&&=) 		 ☑ 
short-circuit-or (||=) 			 ☑ 
Type Annotations 			 ☑ 

Riferimenti

1

Da un punto di vista degli sviluppatori, che contano di più:

1) Jav l'ascript non è realmente OOP, non ha una parola chiave super, il che significa che se si sostituisce (in qualsiasi modo) qualcosa, non è possibile chiamarlo tramite super, e questo è l'interruttore per programmi complessi per cui OOP è la chiave, e Actionscript3 è tutto OOP, puoi avere milioni di righe di codice Actionscript3 che lavorano insieme e sono ben tenute.

2) Actionscript3 viene eseguito in Flash Player che ha una sola implementazione da Adobe, ciò significa che è sempre coerente, tutti i browser (purché installato Flash Player), ma Javascript viene eseguito direttamente nei browser, ma ogni browser ha il suo propria implementazione, il che significa che il codice Javascript deve essere testato su tutti i browser target per garantire il funzionamento.

+0

"JavaScript non è realmente OOP". JavaScript è molto orientato agli oggetti. Di che diavolo stai parlando. "non puoi chiamare [un metodo sovrascritto] tramite super". Il fatto che ti aspetti idiomi basati su classi in un linguaggio basato su prototipi sta dicendo. Penso che troverete che JavaScript è più che capace di polimorfismo. "Deal Breaker per programmi complessi per i quali OOP è la chiave" OOP non è la soluzione a tutto. Penso che dovresti esaminare altri paradigmi di programmazione prima di fare affermazioni così ingenue. –

+0

"Actionscript3 viene eseguito in Flash Player che ha solo un'implementazione ... ma Javascript ... ogni browser ha una propria implementazione, il che significa che il codice Javascript deve essere testato su tutti i browser target ..." Assurdità completa e totale. Tutte le lingue ampiamente utilizzate sono definite da uno standard. Lo standard definisce come deve essere implementata la lingua e qualsiasi implementazione seria seguirà lo standard. Se è necessario "feature test", si sta utilizzando un'estensione fornitore. Non è colpa della lingua essere inconsistenti; è tuo per l'utilizzo di funzionalità/estensioni non standard. –

-3

francamente non è la stessa cosa, lo script di azione cuz è caricato con EMQJ24, la nuova lingua per il sito web di sviluppo elevato. mentre JS ancora con esso EMCA22, la differenza tra quelli sono lo stile e il formato del codice. e anche lo script di azione ha un'età sufficiente, ecco perché la maggior parte dei programmatori ora utilizza la lingua aggiornata da CSX01 dal cSS, può riconoscere tutti i tipi di linguaggio senza linea.

+4

Potresti per favore attenersi al inglese comune? Ho difficoltà a capire cosa hai scritto. – MeanGreen

Problemi correlati