2010-02-15 25 views
33

Tôi biết cả hai ngôn ngữ đều có cùng tiêu chuẩn ECMA-262. Dường như cả hai đang trở nên rất giống với JavaScript thêm các trình lắng nghe sự kiện cho các cá thể Object Object thông qua các phương thức như freezeseal trong ấn bản thứ 5 EMCAScript-262 và như vậy. Tôi đã tự hỏi sự khác biệt là gì?Sự khác nhau chính giữa JavaScript và ActionScript 3 là gì?

+3

Không thực sự là cùng một tiêu chuẩn. AS-3 là từ ECMAScript 4 hiện tại đã chết (a.k.a. Javascript 2.0), và Javascript mà chúng ta thấy bây giờ chủ yếu là từ ECMAScript 3. – kennytm

Trả lời

31

Trước hết, cả ActionScript 3 và JavaScript đều được xác định trong ECMA-262 để chúng có nhiều điểm chung. Cả hai ngôn ngữ đều có tính năng thừa kế mẫu thử nghiệm. Tuy nhiên, không đúng là ActionScript thực hiện đầy đủ ES4.

ActionScript thực hiện một vài tính năng không được xác định trong ECMA-262 và một số - nhưng chắc chắn không phải là tất cả - của ES4.

Vậy AS3 thêm gì vào ECMA-262?Những cũng có những khác biệt để hoạt Javascript:

  • động và mã tĩnh gõ
  • gói, lớp và giao diện
  • mô hình OO thừa kế tiêu chuẩn (không nguyên mẫu dựa, tĩnh đánh máy)
  • uint và int datatype
  • E4X (ECMA-357)
  • Biên dịch có điều kiện loại an toàn (ES4)
  • Vector. <T> datatype (ES4)

Có lẽ tôi đã quên một số tính năng. Tôi không chắc chắn nếu XML, XMLList vv đã được xác định trong 262 hoặc đi kèm với 357.

Tuy nhiên, sự khác biệt chính là thư viện chuẩn. JavaScript đi kèm với một vài lớp được xác định trước như DOMElement và các phần bổ sung phụ thuộc vào trình duyệt. ActionScript có một thư viện chuẩn khá lớn với các tính năng như phát video và nhất quán trên tất cả các nền tảng.

5

Một loại là Safetly. Actionscript yêu cầu bạn đặt loại cho tất cả các đối tượng và JavaScript không (đối với vấn đề đó, trong JavaScript, một biến có thể là một loại và sau đó đặt ngay lập tức thành một loại khác).

Actionscript là hướng đối tượng. Mặc dù bạn có thể sắp xếp điều này bằng JavaScript, Actionscript cho phép thừa kế đối tượng, v.v.

+0

giống như AS2 (yay!) –

+7

Có thừa kế trong Javascript. Đó là thừa kế nguyên mẫu. – kennytm

+2

Không, bạn không cần phải nhập một tham chiếu đối tượng trong ActionScript. Bạn làm tương tự như trong JavaScript: var x = ... –

12

Tôi đã lập trình ở cả ActionScript và Javascript và từ quan điểm kém kỹ thuật, tôi thấy hai khác biệt chính.

1) JavaScript mạnh hơn. Bạn được phép làm nhiều hơn nữa với ngôn ngữ bởi vì nó không có một "trình biên dịch" hoặc các loại. Có một số khung công tác tuyệt vời ngoài kia như ExtJSjQuery để thử và đơn giản hóa mọi thứ cho bạn, nhưng ngay cả với chúng, bạn thực sự được phép làm một lượng sát thương đáng kinh ngạc nếu bạn muốn.

2) ActionScript có nhiều hạn chế hơn và do đó, dễ bảo trì hơn nhiều. Adobe đã làm rất nhiều việc để giúp bạn thoát khỏi những phần khó khăn của ECMAScript. Các đối tượng ECMAScript, sự thừa kế nguyên mẫu và các bao đóng là ba khái niệm mà bạn thực sự không cần phải hiểu về chương trình trong ActionScript. Bạn chỉ cần hiểu cách sử dụng đối tượng "Lớp" của Adobe.

Để sử dụng đơn giản, tôi thích JavaScript hơn. Tuy nhiên, một khi dự án được lớn, nó phụ thuộc vào những người bạn đang mã hóa cho. Nếu tôi có một nhóm gồm 5 lập trình viên phát triển khi khởi động, tôi sẽ chọn JavaScript trong một nhịp tim. Tuy nhiên, trong chu vi của một tập đoàn lớn, hoặc học viện, bạn có thể an toàn hơn dựa trên nền tảng của Adobe.

Hy vọng điều đó sẽ hữu ích.

+3

* “Để sử dụng đơn giản, tôi thích JavaScript hơn.” * Xin lỗi? Tôi nghĩ rằng ActionScript không thể được sử dụng bên ngoài Flash. – kennytm

+0

Đó là sự thật, nó không thể. Tôi xin lỗi nếu tôi ngụ ý điều đó. Một nửa lý do tôi sẽ sử dụng JavaScript cho các dự án nhỏ là bởi vì người dùng sẽ không cần phải xử lý flash. – Stephano

+0

Điểm tốt Stephano. Đánh giá cao thông tin. – Chin

4

Về cơ bản, sự khác biệt chính mà tôi thấy là ActionScript là một ngôn ngữ dựa trên lớp được đánh máy theo kiểu tĩnh hơn khi javascript là ngôn ngữ nguyên mẫu. Không may là không có kiểu suy luận nào trong ActionScript nên Flex Builder đưa ra cảnh báo mỗi khi bạn bỏ một thứ gì đó mà tôi thấy không cần thiết và quá chi tiết, không chỉ làm cho nó dài hơn javascript mà tôi tìm thấy mã tương đương có nhiều chi tiết hơn C#.

Tuy nhiên, độ dài bổ sung không mang lại cải thiện hoàn hảo và an toàn loại bổ sung tại thời gian biên dịch. Thật không may, điều này cũng làm tăng thời gian xây dựng khá đáng kể, trong các ứng dụng Java Script có kích thước bất kỳ mà tôi đã sử dụng để phản hồi ngay lập tức trong khi dự án ActionScript cuối cùng của tôi đã có thời gian hơn 2 phút.

3

Sự khác biệt chính là ActionScript 3 hỗ trợ cả thừa kế dựa trên lớp và thừa kế nguyên mẫu, thực thi ràng buộc không gian tên giữa tên lớp và tên tệp và không hỗ trợ một số phương thức JavaScript toàn cục như eval. May mắn thay, bạn có thể làm vài việc để thu hẹp khoảng cách.

Bạn trên toàn cầu có thể thiết lập không gian tên sử dụng ES cho ECMAScript hoặc AS3 cho ActionScript 3:

use namespace ES; 
use namespace AS3; 

Nếu bạn đang sử dụng không gian tên AS3, bất kỳ phương pháp ghi đè lên phải sử dụng namespace AS3 và thuộc tính ghi đè.

Nếu bạn không sử dụng không gian tên AS3, bạn có thể sử dụng các phương thức mẫu và propertyIsEnumerable.

Bạn có chọn lọc có thể sử dụng phiên bản AS3 namespace của một tài sản hoặc phương pháp trong một hàm động:

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

Để tắt lớp dựa thừa kế, bạn cũng có thể sử dụng các tùy chọn trình biên dịch như sau: compc -as3=false -strict=false -es=true

import * 
class foo 
    { 
    dynamic function foo() 
    { 

    } 
    } 

Nếu bạn không sử dụng không gian tên AS3, một thể hiện của một lớp lõi kế thừa các thuộc tính và phương thức được xác định trên đối tượng mẫu thử nghiệm.

Nếu bạn quyết định sử dụng không gian tên AS3, một cá thể của một lớp lõi kế thừa các thuộc tính và phương thức được xác định trong định nghĩa lớp.

Đây là một đặc điểm chung giữa ECMAScript-4 và ECMAScript-2017 hay muộn:

 
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 			 ☑ 

Tài liệu tham khảo

1

Từ quan điểm phát triển của xem, những gì quan trọng nhất:

1) Jav ascript không thực sự là OOP, nó không có từ khóa siêu, có nghĩa là nếu bạn ghi đè lên (bằng bất kỳ phương tiện nào), bạn không thể gọi nó qua siêu, và đây là bộ ngắt giao dịch cho các chương trình phức tạp mà OOP là khóa và Actionscript3 là tất cả OOP, bạn có thể có hàng triệu dòng mã Actionscript3 hoạt động cùng nhau và được duy trì tốt. Actions2 chạy trong Flash Player chỉ có một cài đặt từ Adobe, điều này có nghĩa là nó luôn phù hợp, tất cả các trình duyệt (miễn là Flash Player đã cài đặt), nhưng Javascript chạy trong trình duyệt trực tiếp, nhưng mỗi trình duyệt đều có thực hiện riêng, có nghĩa là mã Javascript của bạn phải được kiểm tra đối với tất cả các trình duyệt được nhắm mục tiêu để đảm bảo hoạt động.

+0

"JavaScript không thực sự là OOP". JavaScript rất hướng đối tượng. Mày đang nói cái quái gì vậy. "bạn không thể gọi [phương pháp ghi đè] thông qua siêu". Thực tế là bạn mong đợi các thành ngữ dựa trên lớp trong một ngôn ngữ dựa trên nguyên mẫu là nói. Tôi nghĩ rằng bạn sẽ tìm thấy JavaScript là nhiều hơn khả năng đa hình. "đối phó với các chương trình phức tạp mà OOP là chìa khóa" OOP không phải là giải pháp cho mọi thứ. Tôi nghĩ bạn nên nhìn vào các mô hình lập trình khác trước khi bạn đưa ra những tuyên bố ngây thơ như vậy. –

+0

"Actionscript3 chạy trong Flash Player chỉ có một lần triển khai ... nhưng Javascript ... mỗi trình duyệt đều có cài đặt riêng, có nghĩa là mã Javascript của bạn phải được kiểm tra đối với tất cả các trình duyệt được nhắm mục tiêu ..." Hoàn thành và hoàn toàn vô nghĩa. Tất cả các ngôn ngữ được sử dụng rộng rãi được xác định bởi một tiêu chuẩn. Tiêu chuẩn xác định cách ngôn ngữ sẽ được triển khai và mọi triển khai nghiêm túc sẽ tuân theo tiêu chuẩn. Nếu bạn cần "thử nghiệm tính năng", bạn đang sử dụng tiện ích mở rộng của nhà cung cấp. Đó không phải là lỗi của ngôn ngữ vì không nhất quán; đó là của bạn để sử dụng các tính năng/tiện ích không chuẩn. –

-3

thẳng thắn là không giống nhau, tập lệnh hành động cuz được tải bằng EMQJ24, ngôn ngữ mới cho trang web phát triển cao. trong khi JS vẫn còn với EMCA22, sự khác biệt giữa chúng là kiểu và định dạng của mã. và cũng là kịch bản hành động đủ tuổi, đó là lý do tại sao hầu hết các lập trình viên ngày nay sử dụng ngôn ngữ cập nhật CSX01 từ cSS, nó có thể nhận ra tất cả các loại ngôn ngữ không có bất kỳ dòng nào.

+4

Bạn có thể gắn bó với tiếng Anh thông dụng không? Tôi có một thời gian khó hiểu những gì bạn đã viết. – MeanGreen

Các vấn đề liên quan