JavaScript和ActionScript3之间的主要区别是什么?

JavaScript和ActionScript3之间的主要区别是什么?,javascript,actionscript-3,porting,Javascript,Actionscript 3,Porting,我知道这两种语言来自同一个ECMA-262标准。这两者似乎变得非常相似,JavaScript通过EMCAScript-262第5版中的freeze和seal等方法为核心对象实例添加事件监听器。我想知道有什么区别吗?一个是打字安全。Actionscript要求为所有对象设置一个类型,而JavaScript则不需要(在JavaScript中,一个变量可能是一种类型,然后立即设置为另一种类型) Actionscript是面向对象的。虽然可以在JavaScript中实现这一点,但Actionscript

我知道这两种语言来自同一个ECMA-262标准。这两者似乎变得非常相似,JavaScript通过EMCAScript-262第5版中的
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)
也许我忘记了一些特征。我不确定XML、XMLList等是否已经在262中定义,或者是随357一起定义


然而,关键的区别在于标准库。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☑ 等级☑ 接口☑ 静态场☑ 参数默认值☑ 静止参数☑ 绑定方法☑ 动态此值☑ 多重捕获子句☑ 短路和(&&=)☑ 短路或(| |=)☑ 类型注释☑ 参考资料


从开发人员的角度来看,最重要的是:

1) Javascript不是真正的OOP,它没有super关键字,这意味着如果你覆盖(通过任何方式)某个东西,你不能通过super调用它,这就是交易br