JavaScript和ActionScript3之间的主要区别是什么?
我知道这两种语言来自同一个ECMA-262标准。这两者似乎变得非常相似,JavaScript通过EMCAScript-262第5版中的JavaScript和ActionScript3之间的主要区别是什么?,javascript,actionscript-3,porting,Javascript,Actionscript 3,Porting,我知道这两种语言来自同一个ECMA-262标准。这两者似乎变得非常相似,JavaScript通过EMCAScript-262第5版中的freeze和seal等方法为核心对象实例添加事件监听器。我想知道有什么区别吗?一个是打字安全。Actionscript要求为所有对象设置一个类型,而JavaScript则不需要(在JavaScript中,一个变量可能是一种类型,然后立即设置为另一种类型) Actionscript是面向对象的。虽然可以在JavaScript中实现这一点,但Actionscript
freeze
和seal
等方法为核心对象实例添加事件监听器。我想知道有什么区别吗?一个是打字安全。Actionscript要求为所有对象设置一个类型,而JavaScript则不需要(在JavaScript中,一个变量可能是一种类型,然后立即设置为另一种类型)
Actionscript是面向对象的。虽然可以在JavaScript中实现这一点,但Actionscript允许对象继承,等等。我一直在Actionscript和JavaScript中编程,从技术性较低的角度来看,我看到了两个主要区别 1) JavaScript更强大。您可以对该语言进行更多操作,因为它没有“编译器”或类型。有一些很棒的框架,比如和,它们试图为您简化一些事情,但是即使有了它们,如果您想做的话,您也可以做大量的破坏 2) ActionScript更具限制性,因此更易于维护。Adobe做了大量的工作,让您远离ECMAScript的困难部分。ECMAScript对象、原型继承和闭包是在ActionScript中编程时确实不需要理解的三个概念。您只需要了解如何使用Adobe的“类”对象 对于简单的使用,我更喜欢JavaScript。然而,一旦项目变得庞大,它就取决于您为谁编码。如果我有一个由5名开发人员组成的团队在一家充满活力的初创公司编程,我会立刻选择JavaScript。然而,在大公司或学术界,依赖Adobe平台可能更安全
希望这能有所帮助。本质上,我发现ActionScript的主要区别在于它更像是一种冗长的基于静态类型的类的语言,而javascript则是一种原型语言 不幸的是,ActionScript中没有类型推断,因此每当您留下一些我认为不必要且过于冗长的未类型化内容时,使用Flex Builder都会发出警告,这不仅会使其比javascript更冗长,而且我发现等效代码比C更冗长
然而,额外的详细性确实在编译时带来了性能改进和额外的类型安全性。不幸的是,这也大大增加了构建时间,在任何大小的Java脚本应用程序中,我都习惯于即时反馈,而我的上一个ActionScript项目的构建时间超过了2分钟。首先,ActionScript 3和JavaScript都是在中定义的,因此它们有很多共同点。例如,这两种语言都以原型继承为特征。然而,完全实现ActionScript是不正确的 ActionScript实现了ECMA-262和ES4的一些(但肯定不是全部)中未定义的一些特性 那么AS3给ECMA-262增加了什么呢?这些也是与JavaScript的区别:
- 动态和静态类型的代码
- 包、类和接口
- 标准OO继承模型(非基于原型、静态类型)
- uint和int数据类型
- E4X(ECMA-357)
- 类型安全条件编译(ES4)
- 向量。数据类型(ES4)
然而,关键的区别在于标准库。JavaScript附带了两个预定义的类,如DomeElement和依赖浏览器的附加类。ActionScript有一个相当大的标准库,具有视频流等功能,在所有平台上都是一致的。关键区别在于ActionScript 3支持基于类的继承和原型继承,在类名和文件名之间强制命名空间绑定,并且不支持一些全局JavaScript方法,例如
eval
。幸运的是,你可以做几件事来缩小差距
对于ECMAScript,可以使用ES全局设置命名空间,对于ActionScript 3,可以使用AS3全局设置命名空间:
use namespace ES;
use namespace AS3;
如果您使用的是AS3命名空间,则任何方法重写都必须使用AS3命名空间
和覆盖属性
如果不使用AS3命名空间,则可以使用prototype方法和PropertyEnumerable
您可以在动态函数中有选择地使用属性或方法的AS3命名空间版本:
var nums:Array = new Array(1, 2, 3);
nums.AS3::pop();
trace(nums); // output: 1,2
要关闭基于类的继承,还可以使用以下编译器选项:
compc-as3=false-strict=false-es=true
import *
class foo
{
dynamic function foo()
{
}
}
如果不使用AS3命名空间,则核心类的实例将继承
在prototype对象上定义的属性和方法
如果决定使用AS3命名空间,则核心类的实例将继承
类定义中定义的属性和方法
以下是ECMAScript-4和ECMAScript-2017或更高版本之间的共同特点:
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 ☑
仅限ES4/ES6+ES4功能
静止参数☑
解构☑
ByteArrays☑
等级☑
接口☑
静态场☑
参数默认值☑
静止参数☑
绑定方法☑
动态此值☑
多重捕获子句☑
短路和(&&=)☑
短路或(| |=)☑
类型注释☑
参考资料