Je sais que les deux langues sont issues de la même norme ECMA-262. Il semble que les deux deviennent très similaires, JavaScript ajoutant des écouteurs d'événements pour les instances d'objets de base par le biais de méthodes telles que freeze
y seal
dans EMCAScript-262 5ème édition et autres. Je me demandais quelles étaient les différences ?
Réponses
Trop de publicités?Tout d'abord ActionScript 3 et JavaScript sont tous deux définis dans ECMA-262 donc ils ont beaucoup de choses en commun. Les deux langages disposent par exemple de l'héritage des prototypes. Il n'est cependant pas exact qu'ActionScript implémente entièrement ES4 .
ActionScript met en œuvre quelques fonctionnalités qui ne sont pas définies dans l'ECMA-262 et certaines -- mais certainement pas toutes -- dans l'ES4.
Alors, qu'est-ce que l'AS3 ajoute à l'ECMA-262 ? Ce sont également les différences avec JavaScript :
- Code typographié dynamiquement et statiquement
- Paquets, classes et interfaces
- Modèle d'héritage OO standard (non basé sur des prototypes, typage statique)
- Type de données uint et int
- E4X (ECMA-357)
- Compilation conditionnelle sécurisée par type (ES4)
- Type de données Vector.<T> (ES4)
J'ai peut-être oublié certaines fonctionnalités. Je ne sais pas si XML, XMLList, etc. sont déjà définis dans la version 262 ou s'ils sont fournis avec la version 357.
La principale différence réside toutefois dans la bibliothèque standard. JavaScript est livré avec quelques classes prédéfinies comme DOMElement et des ajouts dépendant du navigateur. ActionScript dispose d'une bibliothèque standard assez importante, avec des fonctionnalités telles que le streaming vidéo, et est cohérent sur toutes les plateformes.
J'ai programmé à la fois en ActionScript et en Javascript, et d'un point de vue moins technique, je vois deux différences principales.
1) JavaScript est plus puissant. Vous êtes autorisé à faire beaucoup plus avec le langage parce qu'il n'a pas de "compilateur" ou de types. Il existe d'excellents frameworks comme ExtJS y jQuery qui essaient de simplifier les choses pour vous, mais même avec eux, vous êtes vraiment autorisé à faire une quantité incroyable de dégâts si vous le voulez.
2) ActionScript est beaucoup plus contraignant et donc beaucoup plus facile à maintenir. Adobe a fait beaucoup d'efforts pour vous tenir à l'écart des parties difficiles de l'ECMAScript. Les objets ECMAScript, l'héritage prototypique et les fermetures sont trois concepts que vous n'avez pas vraiment besoin de comprendre pour programmer en ActionScript. Il vous suffit de comprendre comment utiliser l'objet "Class" d'Adobe.
Pour les utilisations simples, je préfère JavaScript. Cependant, dès que le projet prend de l'ampleur, cela dépend pour qui vous codez. Si j'avais une équipe de 5 développeurs programmant dans une start-up, je choisirais JavaScript sans hésiter. Toutefois, dans le cadre d'une grande entreprise ou d'un établissement universitaire, il est plus prudent de s'appuyer sur la plate-forme Adobe.
J'espère que cela vous aidera.
L'un d'eux est le type Safetly. Actionscript exige que vous définissiez un type pour tous les objets, ce qui n'est pas le cas de JavaScript (d'ailleurs, en JavaScript, une variable peut être d'un certain type, puis immédiatement d'un autre type).
Actionscript est orienté objet. Bien que vous puissiez en quelque sorte avoir cela en JavaScript, Actionscript permet l'héritage d'objets, etc.
Essentiellement, la principale différence que je trouve est qu'ActionScript est plus un langage verbeux basé sur des classes à typage statique alors que javascript est un langage prototypique.
Malheureusement, il n'y a pas d'inférence de type dans ActionScript, de sorte que l'utilisation de Flex Builder donne un avertissement chaque fois que vous laissez un élément non typé, ce que je trouve inutile et trop verbeux. Non seulement il est plus verbeux que javascript, mais je trouve que le code équivalent est plus verbeux que C#.
Cependant, la verbosité supplémentaire permet d'améliorer les performances et la sécurité des types au moment de la compilation. Malheureusement, cela ajoute aussi au temps de construction de manière assez significative, dans les applications Java script de n'importe quelle taille, je suis habitué à un retour instantané alors que mon dernier projet ActionScript avait un temps de construction dépassant les 2 minutes.
Les principales différences sont les suivantes : ActionScript 3 prend en charge l'héritage basé sur les classes et l'héritage prototypique, impose des liaisons d'espace de nom entre les noms de classe et les noms de fichier, et ne prend pas en charge certaines méthodes JavaScript globales telles que eval
. Heureusement, vous pouvez faire plusieurs choses pour combler ce fossé.
Vous pouvez définir globalement l'espace de nom en utilisant ES pour ECMAScript ou AS3 pour ActionScript 3 :
use namespace ES;
use namespace AS3;
Si vous utilisez l'espace de noms AS3, tout remplacement de méthode doit utiliser l'espace de noms AS3. et l'attribut override.
Si vous n'utilisez pas l'espace de noms AS3, vous pouvez utiliser les méthodes de prototype et les propertyIsEnumerable
.
Vous pouvez utiliser de manière sélective la version de l'espace de nom AS3 d'une propriété ou d'une méthode dans une fonction dynamique :
var nums:Array = new Array(1, 2, 3);
nums.AS3::pop();
trace(nums); // output: 1,2
Pour désactiver l'héritage basé sur les classes, vous pouvez également utiliser les options de compilation suivantes : compc -as3=false -strict=false -es=true
import *
class foo
{
dynamic function foo()
{
}
}
Si vous n'utilisez pas l'espace de noms AS3, une instance d'une classe de base hérite des propriétés et méthodes définies sur l'objet prototype.
Si vous décidez d'utiliser l'espace de noms AS3, une instance d'une classe de base hérite de l'attribut propriétés et méthodes définies dans la définition de la classe.
Voici les caractéristiques communes entre ECMAScript-4 et ECMAScript-2017 ou ultérieur :
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 ☑
Références