Hướng dẫn what was the first name of javascript - tên đầu tiên của javascript là gì
".js" chuyển hướng ở đây. Đối với phương ngữ Microsoft được sử dụng trong Internet Explorer, xem JScript. Show
JavaScript (), thường được viết tắt là JS, là ngôn ngữ lập trình là một trong những công nghệ cốt lõi của World Wide Web, cùng với HTML và CSS. Tính đến năm 2022, 98% trang web sử dụng JavaScript ở phía máy khách cho hành vi trang web, thường kết hợp các thư viện của bên thứ ba. Tất cả các trình duyệt web chính có một công cụ JavaScript chuyên dụng để thực thi mã trên thiết bị của người dùng. (), often abbreviated as JS, is a programming language that is one of the core technologies of the World Wide Web, alongside HTML and CSS. As of 2022, 98% of websites use JavaScript on the client side for webpage behavior, often incorporating third-party libraries. All major web browsers have a dedicated JavaScript engine to execute the code on users' devices. JavaScript là một ngôn ngữ được biên dịch cấp cao, thường chỉ trong thời gian phù hợp với tiêu chuẩn Ecmascript. [10] Nó có gõ động, định hướng đối tượng dựa trên nguyên mẫu và các hàm hạng nhất. Đó là các phong cách đa mô hình, hỗ trợ các phong cách lập trình theo sự kiện, chức năng và bắt buộc. Nó có giao diện lập trình ứng dụng (API) để làm việc với văn bản, ngày, biểu thức chính quy, cấu trúc dữ liệu tiêu chuẩn và mô hình đối tượng tài liệu (DOM). Tiêu chuẩn ECMAScript không bao gồm bất kỳ đầu vào/đầu ra (I/O) nào, chẳng hạn như mạng, lưu trữ hoặc đồ họa. Trong thực tế, trình duyệt web hoặc hệ thống thời gian chạy khác cung cấp API JavaScript cho I/O. Các động cơ JavaScript ban đầu chỉ được sử dụng trong các trình duyệt web, nhưng hiện là thành phần cốt lõi của một số máy chủ và một loạt các ứng dụng. Hệ thống thời gian chạy phổ biến nhất cho việc sử dụng này là Node.js. Mặc dù Java và JavaScript tương tự nhau về tên, cú pháp và thư viện tiêu chuẩn tương ứng, hai ngôn ngữ rất khác biệt và khác nhau rất nhiều trong thiết kế. History[edit][edit]Sáng tạo tại Netscape [Chỉnh sửa][edit]Trình duyệt Web đầu tiên với giao diện người dùng đồ họa, khảm, được phát hành vào năm 1993. Có thể truy cập được cho những người phi kỹ thuật, nó đóng một vai trò nổi bật trong sự phát triển nhanh chóng của Web World Wide Wide. [11] Các nhà phát triển chính của khảm sau đó đã thành lập Tập đoàn Netscape, nơi phát hành một trình duyệt được đánh bóng hơn, Netscape Navigator, vào năm 1994. Điều này nhanh chóng trở thành được sử dụng nhiều nhất. [12] [13] Trong những năm hình thành của web, các trang web chỉ có thể tĩnh, thiếu khả năng cho hành vi động sau khi trang được tải trong trình duyệt. Có một mong muốn trong bối cảnh phát triển web hưng thịnh để loại bỏ giới hạn này, vì vậy vào năm 1995, Netscape đã quyết định thêm một ngôn ngữ kịch bản vào Navigator. Họ đã theo đuổi hai tuyến đường để đạt được điều này: hợp tác với Sun Microsystems để nhúng ngôn ngữ lập trình Java, đồng thời thuê Brendan Eich để nhúng ngôn ngữ sơ đồ. [6] Quản lý Netscape sớm quyết định rằng lựa chọn tốt nhất là Eich đưa ra một ngôn ngữ mới, với cú pháp tương tự như Java và ít giống như sơ đồ hoặc các ngôn ngữ kịch bản còn tồn tại khác. [5] [6] Mặc dù ngôn ngữ mới và việc thực hiện thông dịch viên của nó được gọi là Livescript khi lần đầu tiên được vận chuyển như một phần của bản beta của Navigator vào tháng 9 năm 1995, tên này đã được đổi thành JavaScript để phát hành chính thức vào tháng 12. [6] [1] [14] Sự lựa chọn của tên JavaScript đã gây ra sự nhầm lẫn, ngụ ý rằng nó có liên quan trực tiếp đến Java. Vào thời điểm đó, sự bùng nổ dot-com đã bắt đầu và Java là ngôn ngữ mới nóng bỏng, vì vậy Eich coi tên JavaScript là một mưu đồ tiếp thị của Netscape. [15] Việc áp dụng bởi Microsoft [Chỉnh sửa][edit]Microsoft đã ra mắt Internet Explorer vào năm 1995, dẫn đến một cuộc chiến trình duyệt với Netscape. Trên mặt trận JavaScript, Microsoft đã thiết kế đảo ngược trình thông dịch điều hướng để tạo riêng, được gọi là JScript. [16] JScript được phát hành lần đầu tiên vào năm 1996, cùng với sự hỗ trợ ban đầu cho CSS và phần mở rộng cho HTML. Mỗi triển khai này khác nhau đáng kể so với các đối tác của họ trong Navigator. [17] [18] Những khác biệt này khiến các nhà phát triển khó khăn trong việc làm cho trang web của họ hoạt động tốt trong cả hai trình duyệt, dẫn đến việc sử dụng rộng rãi "được xem tốt nhất trong Netscape" và "được xem tốt nhất trong logo Internet Explorer" trong vài năm. [17] [19] Sự gia tăng của JScript [Chỉnh sửa][edit]Vào tháng 11 năm 1996, Netscape đã gửi JavaScript lên ECMA International, là điểm khởi đầu cho một đặc điểm kỹ thuật tiêu chuẩn mà tất cả các nhà cung cấp trình duyệt có thể tuân thủ. Điều này dẫn đến việc phát hành chính thức đặc tả ngôn ngữ Ecmascript đầu tiên vào tháng 6 năm 1997. Quá trình tiêu chuẩn tiếp tục trong một vài năm, với việc phát hành Ecmascript 2 vào tháng 6 năm 1998 và Ecmascript 3 vào tháng 12 năm 1999. Công việc trên Ecmascript 4 bắt đầu vào năm 2000. [16] Trong khi đó, Microsoft có được một vị trí ngày càng chiếm ưu thế trong thị trường trình duyệt. Đến đầu những năm 2000, thị phần của Internet Explorer đạt 95%. [20] Điều này có nghĩa là JScript trở thành tiêu chuẩn thực tế cho kịch bản phía máy khách trên web. Microsoft ban đầu tham gia vào quy trình tiêu chuẩn và thực hiện một số đề xuất bằng ngôn ngữ JScript của mình, nhưng cuối cùng nó đã ngừng hợp tác trong công việc ECMA. Do đó, Ecmascript 4 đã bị mothballed. Tăng trưởng và tiêu chuẩn hóa [Chỉnh sửa][edit]Trong giai đoạn thống trị của Internet Explorer vào đầu những năm 2000, kịch bản phía khách hàng đã bị đình trệ. Điều này bắt đầu thay đổi vào năm 2004, khi người kế vị của Netscape, Mozilla, phát hành trình duyệt Firefox. Firefox đã được nhiều người đón nhận, chiếm thị phần đáng kể từ Internet Explorer. [21] Năm 2005, Mozilla gia nhập ECMA International và công việc bắt đầu theo tiêu chuẩn Ecmascript cho XML (E4X). Điều này dẫn đến việc Mozilla hợp tác với Macromedia (sau này được Adobe Systems), người đang thực hiện E4X trong ngôn ngữ ActionScript 3 của họ, dựa trên bản nháp Ecmascript 4. Mục tiêu trở thành tiêu chuẩn hóa ActionScript 3 với tư cách là Ecmascript 4. Cuối cùng, Adobe Systems đã phát hành triển khai Tamarin như một dự án nguồn mở. Tuy nhiên, Tamarin và Actioncript 3 quá khác biệt so với kịch bản phía khách hàng đã thành lập và không có sự hợp tác từ Microsoft, Ecmascript 4 chưa bao giờ đạt được kết quả. Trong khi đó, những phát triển rất quan trọng đã xảy ra trong các cộng đồng nguồn mở không liên kết với công việc ECMA. Vào năm 2005, Jesse James Garrett đã phát hành một tờ giấy trắng, trong đó anh ta đặt ra thuật ngữ AJAX và mô tả một bộ công nghệ, trong đó JavaScript là xương sống, để tạo các ứng dụng web nơi dữ liệu có thể được tải trong nền, tránh sự cần thiết của trang đầy đủ trang Tải lại. Điều này đã gây ra một thời kỳ Phục hưng của JavaScript, dẫn đầu bởi các thư viện nguồn mở và các cộng đồng hình thành xung quanh họ. Nhiều thư viện mới đã được tạo ra, bao gồm jQuery, nguyên mẫu, bộ công cụ DOJO và mootools. Google đã ra mắt trình duyệt Chrome vào năm 2008, với động cơ JavaScript V8 nhanh hơn so với đối thủ cạnh tranh. [22] [23] Sự đổi mới quan trọng là biên soạn đúng lúc (JIT), [24] vì vậy các nhà cung cấp trình duyệt khác cần thiết để đại tu động cơ của họ cho JIT. [25] Vào tháng 7 năm 2008, những bữa tiệc khác nhau này đã cùng nhau tham dự một hội nghị ở Oslo. Điều này dẫn đến thỏa thuận cuối cùng vào đầu năm 2009 để kết hợp tất cả các công việc có liên quan và thúc đẩy ngôn ngữ tiến lên. Kết quả là tiêu chuẩn Ecmascript 5, được phát hành vào tháng 12 năm 2009. Đạt đến mức trưởng thành [chỉnh sửa][edit]Công việc đầy tham vọng về ngôn ngữ tiếp tục trong vài năm, đỉnh cao là một bộ sưu tập bổ sung và sàng lọc rộng rãi được chính thức hóa với việc xuất bản Ecmascript 6 vào năm 2015. [26] Việc tạo ra Node.js năm 2009 của Ryan Dahl đã gây ra sự gia tăng đáng kể trong việc sử dụng JavaScript bên ngoài trình duyệt web. Node kết hợp động cơ V8, vòng lặp sự kiện và API I/O, do đó cung cấp hệ thống thời gian chạy JavaScript độc lập. [27] [28] Kể từ năm 2018, nút đã được hàng triệu nhà phát triển sử dụng, [29] và NPM có nhiều mô -đun nhất của bất kỳ người quản lý gói nào trên thế giới. [30] Thông số kỹ thuật dự thảo ECMAScript hiện được duy trì công khai trên GitHub và các phiên bản được sản xuất thông qua ảnh chụp nhanh hàng năm. [31] Các sửa đổi tiềm năng đối với ngôn ngữ được xem xét thông qua quy trình đề xuất toàn diện. [32] [33] Bây giờ, thay vì các số phiên bản, các nhà phát triển kiểm tra trạng thái của các tính năng sắp tới riêng lẻ. [31] Hệ sinh thái JavaScript hiện tại có nhiều thư viện và khung, thực tiễn lập trình được thiết lập và sử dụng đáng kể JavaScript bên ngoài trình duyệt web. Thêm vào đó, với sự gia tăng của các ứng dụng một trang và các trang web nặng JavaScript khác, một số bộ chuyển đổi đã được tạo ra để hỗ trợ quá trình phát triển. [34] Trademark[edit][edit]"JavaScript" là nhãn hiệu của Oracle Corporation tại Hoa Kỳ. [35] [36] Thương hiệu ban đầu được phát hành cho Sun Microsystems vào ngày 6 tháng 5 năm 1997 và được chuyển đến Oracle khi họ có được Sun vào năm 2010. Sử dụng phía khách hàng trang web [Chỉnh sửa][edit]JavaScript là ngôn ngữ kịch bản phía máy khách thống trị của Web, với 98% tất cả các trang web (giữa năm 2022) sử dụng nó cho mục đích này. [37] Các tập lệnh được nhúng vào hoặc bao gồm từ các tài liệu HTML và tương tác với DOM. Tất cả các trình duyệt web chính có một công cụ JavaScript tích hợp để thực thi mã trên thiết bị của người dùng.(mid–2022) using it for this purpose.[37] Scripts are embedded in or included from HTML documents and interact with the DOM. All major web browsers have a built-in JavaScript engine that executes the code on the user's device. Ví dụ về hành vi kịch bản [chỉnh sửa][edit]
Thư viện và khung [Chỉnh sửa][edit]Hơn 80% các trang web sử dụng thư viện JavaScript của bên thứ ba hoặc khung web cho kịch bản phía máy khách của họ. [38] JQuery cho đến nay là thư viện phổ biến nhất, được sử dụng bởi hơn 75% trang web. [38] Facebook đã tạo thư viện React cho trang web của mình và sau đó phát hành nó dưới dạng nguồn mở; Các trang web khác, bao gồm Twitter, hiện sử dụng nó. Tương tự như vậy, khung góc được tạo bởi Google cho các trang web của mình, bao gồm YouTube và Gmail, hiện là một dự án nguồn mở được sử dụng bởi những người khác. [38] Ngược lại, thuật ngữ "Vanilla JS" đã được đặt ra cho các trang web không sử dụng bất kỳ thư viện hoặc khung nào, thay vào đó hoàn toàn dựa vào chức năng JavaScript tiêu chuẩn. [39] Cách sử dụng khác [chỉnh sửa][edit]Việc sử dụng JavaScript đã mở rộng ra ngoài nguồn gốc trình duyệt web của nó. Các động cơ JavaScript hiện được nhúng trong một loạt các hệ thống phần mềm khác, cả cho việc triển khai trang web phía máy chủ và các ứng dụng không phải là trình duyệt. Những nỗ lực ban đầu trong việc quảng bá sử dụng JavaScript phía máy chủ là NetScape Enterprise Server và các dịch vụ thông tin Internet của Microsoft, [40] [41] nhưng chúng là những ngóc ngách nhỏ. [42] Việc sử dụng phía máy chủ cuối cùng đã bắt đầu phát triển vào cuối những năm 2000, với việc tạo Node.js và các phương pháp khác. [42] Electron, Cordova, React Native và các khung ứng dụng khác đã được sử dụng để tạo ra nhiều ứng dụng với hành vi được thực hiện trong JavaScript. Các ứng dụng không phải trình duyệt khác bao gồm hỗ trợ Adobe Acrobat cho các tài liệu PDF kịch bản [43] và phần mở rộng vỏ Gnome được viết bằng JavaScript. [44] JavaScript gần đây đã bắt đầu xuất hiện trong một số hệ thống nhúng, thường là bằng cách tận dụng nút.js. [45] [46] [47] Features[edit][edit]Các tính năng sau đây là phổ biến cho tất cả các triển khai Ecmascript phù hợp trừ khi được chỉ định rõ ràng khác. Bắt buộc và có cấu trúc [chỉnh sửa][edit]JavaScript hỗ trợ phần lớn cú pháp lập trình có cấu trúc từ C (ví dụ: các câu lệnh console.log("Hello, World!");7, các vòng lặp console.log("Hello, World!");8, các câu lệnh console.log("Hello, World!");9, vòng lặp // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class0, v.v.). Một ngoại lệ một phần là phạm vi: ban đầu JavaScript chỉ có phạm vi chức năng với // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class1; Phạm vi khối đã được thêm vào trong Ecmascript 2015 với các từ khóa // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class2 và // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class3. Giống như C, JavaScript tạo ra sự khác biệt giữa các biểu thức và câu lệnh. Một chênh lệch cú pháp so với C là chèn dấu chấm phẩy tự động, cho phép các dấu chấm phẩy (chấm dứt các câu lệnh) được bỏ qua. [48] Gõ yếu [chỉnh sửa][edit]JavaScript được gõ yếu, có nghĩa là một số loại được sử dụng ngầm tùy thuộc vào hoạt động được sử dụng. [49]
Các giá trị được đúc thành các chuỗi như sau: [49]
Các giá trị được đúc theo số bằng cách đúc vào các chuỗi và sau đó đúc các chuỗi thành số. Các quy trình này có thể được sửa đổi bằng cách xác định các hàm function factorial(n) { // Checking the argument for legitimacy. Factorial is defined for positive integers. if (isNaN(n)) { console.error("Non-numerical argument not allowed."); return NaN; // The special value: Not a Number } if (n === 0) return 1; // 0! = 1 if (n < 0) return undefined; // Factorial of negative numbers is not defined. if (n % 1) { console.warn(`${n} will be rounded to the closest integer. For non-integers consider using gamma function instead.`); n = Math.round(n); } // The above checks need not be repeated in the recursion, hence defining the actual recursive part separately below. // The following line is a function expression to recursively compute the factorial. It uses the arrow syntax introduced in ES6. const recursivelyCompute = a => a > 1 ? a * recursivelyCompute(a - 1) : 1; // Note the use of the ternary operator `?`. return recursivelyCompute(n); } factorial(3); // Returns 61 và function factorial(n) { // Checking the argument for legitimacy. Factorial is defined for positive integers. if (isNaN(n)) { console.error("Non-numerical argument not allowed."); return NaN; // The special value: Not a Number } if (n === 0) return 1; // 0! = 1 if (n < 0) return undefined; // Factorial of negative numbers is not defined. if (n % 1) { console.warn(`${n} will be rounded to the closest integer. For non-integers consider using gamma function instead.`); n = Math.round(n); } // The above checks need not be repeated in the recursion, hence defining the actual recursive part separately below. // The following line is a function expression to recursively compute the factorial. It uses the arrow syntax introduced in ES6. const recursivelyCompute = a => a > 1 ? a * recursivelyCompute(a - 1) : 1; // Note the use of the ternary operator `?`. return recursivelyCompute(n); } factorial(3); // Returns 62 trên nguyên mẫu cho chuỗi và số đúc tương ứng. JavaScript đã nhận được những lời chỉ trích về cách nó thực hiện các chuyển đổi này vì sự phức tạp của các quy tắc có thể bị nhầm lẫn vì sự không nhất quán. [50] [49] Ví dụ: khi thêm một số vào một chuỗi, số sẽ được chuyển vào một chuỗi trước khi thực hiện kết nối, nhưng khi trừ một số từ một chuỗi, chuỗi được chuyển thành một số trước khi thực hiện trừ. Chuyển đổi loại JavaScript
cont counter = function() { let count = 0; return function() { return ++count; } }; const x = counter(); x(); // Returns 1 x(); // Returns 2 x(); // Returns 37 (số) Dynamic[edit][edit]cont counter = function() { let count = 0; return function() { return ++count; } }; const x = counter(); x(); // Returns 1 x(); // Returns 2 x(); // Returns 38 (chuỗi) cont counter = function() { let count = 0; return function() { return ++count; } }; const x = counter(); x(); // Returns 1 x(); // Returns 2 x(); // Returns 3 5 (chuỗi)[edit]// Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class5 // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 602 (số) // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 605 (Chuỗi) // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 606 (số) Functional[edit][edit]Thường cũng được đề cập là // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 607 dẫn đến // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 608 (số). Điều này là sai lệch: function factorial(n) { // Checking the argument for legitimacy. Factorial is defined for positive integers. if (isNaN(n)) { console.error("Non-numerical argument not allowed."); return NaN; // The special value: Not a Number } if (n === 0) return 1; // 0! = 1 if (n < 0) return undefined; // Factorial of negative numbers is not defined. if (n % 1) { console.warn(`${n} will be rounded to the closest integer. For non-integers consider using gamma function instead.`); n = Math.round(n); } // The above checks need not be repeated in the recursion, hence defining the actual recursive part separately below. // The following line is a function expression to recursively compute the factorial. It uses the arrow syntax introduced in ES6. const recursivelyCompute = a => a > 1 ? a * recursivelyCompute(a - 1) : 1; // Note the use of the ternary operator `?`. return recursivelyCompute(n); } factorial(3); // Returns 69 được hiểu là một khối mã trống thay vì một đối tượng trống và mảng trống được chuyển đến một số bởi toán tử // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class4 còn lại. Nếu bạn bọc biểu thức trong ngoặc đơn class Ball { constructor(radius) { this.radius = radius; this.area = Math.PI * ( r ** 2 ); } // Classes (and thus objects) can contain functions known as methods show() { drawCircle(this.radius); // References another function (that draws a circle) } }; const myBall = new Ball(5); // Creates a new instance of the ball object with radius 5 myBall.radius++; // Object properties can usually be modified from the outside myBall.show(); // Using the inherited "show" function1, các dấu ngoặc xoăn được hiểu là một đối tượng trống và kết quả của biểu thức là cont counter = function() { let count = 0; return function() { return ++count; } }; const x = counter(); x(); // Returns 1 x(); // Returns 2 x(); // Returns 30 như mong đợi. [49] Delegative[edit][edit]JavaScript hỗ trợ ủy quyền ngầm và rõ ràng. Các chức năng như vai trò (đặc điểm và mixin) JavaScript tự nhiên hỗ trợ các mẫu thực hiện dựa trên chức năng khác nhau [62] như các đặc điểm [63] [64] và mixin. [65] Một hàm như vậy xác định hành vi bổ sung bằng ít nhất một phương thức liên kết với từ khóafunction sum() { let x = 0; for (let i = 0; i < arguments.length; ++i) x += arguments[i]; return x; } sum(1, 2); // Returns 3 sum(1, 2, 3); // Returns 6 // As of ES6, using the rest operator. function sum(...args) { return args.reduce((a,b) => a+b); } sum(1, 2); // Returns 3 sum(1, 2, 3); // Returns 68 trong thân máy ____ của nó. Một vai trò sau đó phải được ủy quyền rõ ràng thông qua let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 80 hoặc let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 81 cho các đối tượng cần có hành vi bổ sung không được chia sẻ thông qua chuỗi nguyên mẫu. Chuỗi nguyên mẫu được đi bộ để, ví dụ, tìm một phương pháp có thể liên quan đến nhưng không thuộc sở hữu trực tiếp của một đối tượng. Khi phương thức được tìm thấy, nó được gọi trong bối cảnh của đối tượng này. Do đó, sự kế thừa trong JavaScript được bao phủ bởi một chủ nghĩa tự động của phái đoàn được liên kết với thuộc tính nguyên mẫu của các hàm tạo hàm. Miscellaneous[edit][edit]JavaScript là ngôn ngữ không chỉ số. Môi trường thời gian chạy thường dựa vào môi trường thời gian chạy (ví dụ: trình duyệt web) để cung cấp các đối tượng và phương thức mà các tập lệnh có thể tương tác với môi trường (ví dụ: DOM trang web). Những môi trường này là một luồng đơn. JavaScript cũng dựa vào môi trường thời gian chạy để cung cấp khả năng bao gồm/nhập tập lệnh (ví dụ: các yếu tố HTMLlet counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 82). Đây không phải là một tính năng ngôn ngữ mỗi se, nhưng nó phổ biến trong hầu hết các triển khai JavaScript. JavaScript xử lý các tin nhắn từ một hàng đợi một lần. JavaScript gọi một hàm được liên kết với mỗi thông báo mới, tạo khung ngăn xếp cuộc gọi với các đối số của hàm và các biến cục bộ. Ngăn xếp cuộc gọi co lại và phát triển dựa trên nhu cầu của chức năng. Khi ngăn xếp cuộc gọi trống khi hoàn thành chức năng, JavaScript sẽ tiến hành tin nhắn tiếp theo trong hàng đợi. Đây được gọi là vòng lặp sự kiện, được mô tả là "chạy để hoàn thành" vì mỗi tin nhắn được xử lý đầy đủ trước khi tin nhắn tiếp theo được xem xét. Tuy nhiên, mô hình đồng thời của ngôn ngữ mô tả vòng lặp sự kiện là không chặn: đầu vào/đầu ra của chương trình được thực hiện bằng các sự kiện và các chức năng gọi lại. Điều này có nghĩa là, ví dụ, JavaScript có thể xử lý một cú nhấp chuột trong khi chờ truy vấn cơ sở dữ liệu để trả về thông tin. [66] Chức năng Variadic có thể được chuyển đến một hàm. Hàm có thể truy cập chúng thông qua các tham số chính thức và cũng thông qua đối tượng let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 83 cục bộ. Các hàm variadic cũng có thể được tạo bằng cách sử dụng phương thức let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 84. Biểu diễn và đối tượng giống như nhiều ngôn ngữ, mảng và đối tượng kịch bản (mảng liên kết trong các ngôn ngữ khác) có thể được tạo bằng cú pháp phím tắt ngắn gọn. Trên thực tế, các chữ này tạo thành cơ sở của định dạng dữ liệu JSON. Biểu thức regularsjavascript cũng hỗ trợ các biểu thức chính quy theo cách tương tự như Perl, cung cấp một cú pháp ngắn gọn và mạnh mẽ cho thao tác văn bản tinh vi hơn các hàm chuỗi tích hợp. [[[[ 67] Lời hứa và Async/AwaitjavaScript hỗ trợ hứa hẹn và async/đang chờ xử lý các hoạt động không đồng bộ. Một đối tượng hứa hẹn tích hợp cung cấp chức năng để xử lý lời hứa và liên kết các trình xử lý với kết quả cuối cùng của hành động không đồng bộ. Gần đây, các phương thức tổ hợp đã được giới thiệu trong đặc tả JavaScript, cho phép các nhà phát triển kết hợp nhiều lời hứa JavaScript và thực hiện các hoạt động dựa trên các kịch bản khác nhau. Các phương pháp được giới thiệu là: Promise.race, Promise.all, Promise.allsettled và Promise.any. ASYNC/AIDIT cho phép một hàm không đồng bộ, không chặn được cấu trúc theo cách tương tự như hàm đồng bộ thông thường. Mã không đồng bộ, không chặn có thể được viết, với chi phí tối thiểu, có cấu trúc tương tự như mã chặn đồng bộ truyền thống. Tiện ích mở rộng dành riêng cho nhà cung cấp [Chỉnh sửa][edit]Trong lịch sử, một số công cụ JavaScript đã hỗ trợ các tính năng không chuẩn này:
Syntax[edit][edit]Ví dụ đơn giản [chỉnh sửa][edit]Các biến trong JavaScript có thể được xác định bằng cách sử dụng các từ khóa ____ 21, [69] ____ 22 [70] hoặc ____ 23 [71]. Các biến được xác định mà không có từ khóa sẽ được xác định ở phạm vi toàn cầu. // Declares a function-scoped variable named `x`, and implicitly assigns the // special value `undefined` to it. Variables without value are automatically // set to undefined. // var is generally considered bad practice and let and const are usually preferred. var x; // Variables can be manually set to `undefined` like so let x2 = undefined; // Declares a block-scoped variable named `y`, and implicitly sets it to // `undefined`. The `let` keyword was introduced in ECMAScript 2015. let y; // Declares a block-scoped, un-reassignable variable named `z`, and sets it to // a string literal. The `const` keyword was also introduced in ECMAScript 2015, // and must be explicitly assigned to. // The keyword `const` means constant, hence the variable cannot be reassigned // as the value is `constant`. const z = "this value cannot be reassigned!"; // Declares a global-scoped variable and assigns 3. This is generally considered // bad practice, and will not work if strict mode is on. t = 3; // Declares a variable named `myNumber`, and assigns a number literal (the value // `2`) to it. let myNumber = 2; // Reassigns `myNumber`, setting it to a string literal (the value `"foo"`). // JavaScript is a dynamically-typed language, so this is legal. myNumber = "foo"; Lưu ý các ý kiến trong ví dụ trên, tất cả đều được đi trước với hai dấu gạch chéo về phía trước. Không có chức năng đầu vào/đầu ra tích hợp trong JavaScript, thay vào đó nó được cung cấp bởi môi trường thời gian chạy. Thông số kỹ thuật ECMAScript trong Phiên bản 5.1 đề cập rằng "không có quy định nào trong thông số kỹ thuật này cho đầu vào dữ liệu bên ngoài hoặc đầu ra của kết quả tính toán". [72] Tuy nhiên, hầu hết các môi trường thời gian chạy đều có đối tượng function* rawCounter() { yield 1; yield 2; } function* dynamicCounter() { let count = 0; while(true) { // It is not recommended to utilize while true loops in most cases. yield ++count; } } // Instances const counter1 = rawCounter(); const counter2 = dynamicCounter(); // Implementation counter1.next(); // {value: 1, done: false} counter1.next(); // {value: 2, done: false} counter1.next(); // {value: undefined, done: true} counter2.next(); // {value: 1, done: false} counter2.next(); // {value: 2, done: false} counter2.next(); // {value: 3, done: false} // ...infinitely0 có thể được sử dụng để in đầu ra. [73] Dưới đây là chương trình Hello World tối giản trong JavaScript trong môi trường thời gian chạy với đối tượng console: console.log("Hello, World!"); Trong các tài liệu HTML, một chương trình như thế này là bắt buộc đối với đầu ra: // Text nodes can be made using the "write" method. // This is frowned upon, as it can overwrite the document if the document is fully loaded. document.write('foo'); // Elements can be made too. First, they have to be created in the DOM. const myElem = document.createElement('span'); // Attributes like classes and the id can be set as well myElem.classList.add('foo'); myElem.id = 'bar'; // After setting this, the tag will look like this: `` myElem.setAttribute('data-attr', 'baz'); // Which could also be written as `myElem.dataset.attr = 'baz'` // Finally append it as a child element to the in the HTML document.body.appendChild(myElem); // Elements can be imperatively grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be looped with forEach document.querySelector('.class'); // Selects the first element with the "class" class document.querySelector('#id'); // Selects the first element with an `id` of "id" document.querySelector('[data-other]'); // Selects the first element with the "data-other" attribute document.querySelectorAll('.multiple'); // Returns an Array of all elements with the "multiple" class Một hàm đệ quy đơn giản để tính toán giai thừa của một số tự nhiên: function factorial(n) { // Checking the argument for legitimacy. Factorial is defined for positive integers. if (isNaN(n)) { console.error("Non-numerical argument not allowed."); return NaN; // The special value: Not a Number } if (n === 0) return 1; // 0! = 1 if (n < 0) return undefined; // Factorial of negative numbers is not defined. if (n % 1) { console.warn(`${n} will be rounded to the closest integer. For non-integers consider using gamma function instead.`); n = Math.round(n); } // The above checks need not be repeated in the recursion, hence defining the actual recursive part separately below. // The following line is a function expression to recursively compute the factorial. It uses the arrow syntax introduced in ES6. const recursivelyCompute = a => a > 1 ? a * recursivelyCompute(a - 1) : 1; // Note the use of the ternary operator `?`. return recursivelyCompute(n); } factorial(3); // Returns 6 Một hàm ẩn danh (hoặc lambda): cont counter = function() { let count = 0; return function() { return ++count; } }; const x = counter(); x(); // Returns 1 x(); // Returns 2 x(); // Returns 3 Ví dụ này cho thấy, trong JavaScript, đóng chức năng đóng các biến không cục bộ của chúng bằng tham chiếu. Các chức năng mũi tên lần đầu tiên được giới thiệu trong Phiên bản thứ 6 - ECMAScript 2015. Họ rút ngắn cú pháp để viết các chức năng trong JavaScript. Các chức năng mũi tên là ẩn danh, vì vậy một biến cần thiết để tham khảo chúng để gọi chúng sau khi chúng tạo ra, trừ khi được bao quanh bởi dấu ngoặc đơn và được thực hiện ngay lập tức. Ví dụ về hàm mũi tên: // Arrow functions let us omit the `function` keyword. // Here `long_example` points to an anonymous function value. const long_example = (input1, input2) => { console.log("Hello, World!"); const output = input1 + input2; return output; }; // If there are no braces, the arrow function simply returns the expression // So here it's (input1 + input2) const short_example = (input1, input2) => input1 + input2; long_example(2, 3); // Prints "Hello, World!" and returns 5 short_example(2, 5); // Returns 7 // If an arrow function has only one parameter, the parentheses can be removed. const no_parentheses = input => input + 2; no_parentheses(3); // Returns 5 // An arrow function, like other function definitions, can be executed in the same statement as they are created. // This is useful when writing libraries to avoid filling the global scope, and for closures. let three = ((a, b) => a + b) (1, 2); const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b); const five_multiples = generate_multiplier_function(5); // The supplied argument "seeds" the expression and is retained by a. five_multiples(1); // Returns 5 five_multiples(3); // Returns 15 five_multiples(4); // Returns 60 Trong JavaScript, các đối tượng thường được tạo bằng cách tạo một thể hiện của một lớp. Các phiên bản cũ hơn của JavaScript thay vào đó sử dụng một đối tượng chức năng. Ví dụ đối tượng: class Ball { constructor(radius) { this.radius = radius; this.area = Math.PI * ( r ** 2 ); } // Classes (and thus objects) can contain functions known as methods show() { drawCircle(this.radius); // References another function (that draws a circle) } }; const myBall = new Ball(5); // Creates a new instance of the ball object with radius 5 myBall.radius++; // Object properties can usually be modified from the outside myBall.show(); // Using the inherited "show" function Trình diễn chức năng Variadic ( let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 83 là một biến đặc biệt): [74] function sum() { let x = 0; for (let i = 0; i < arguments.length; ++i) x += arguments[i]; return x; } sum(1, 2); // Returns 3 sum(1, 2, 3); // Returns 6 // As of ES6, using the rest operator. function sum(...args) { return args.reduce((a,b) => a+b); } sum(1, 2); // Returns 3 sum(1, 2, 3); // Returns 6 Các biểu thức chức năng được phát sóng ngay lập tức thường được sử dụng để tạo đóng cửa. Đóng cửa cho phép thu thập các thuộc tính và phương pháp trong không gian tên và làm cho một số trong số chúng riêng tư: let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 8 Các đối tượng của máy phát (dưới dạng các hàm tạo) cung cấp một hàm có thể gọi, thoát và nhập lại trong khi duy trì bối cảnh nội bộ (trạng thái). [75] function* rawCounter() { yield 1; yield 2; } function* dynamicCounter() { let count = 0; while(true) { // It is not recommended to utilize while true loops in most cases. yield ++count; } } // Instances const counter1 = rawCounter(); const counter2 = dynamicCounter(); // Implementation counter1.next(); // {value: 1, done: false} counter1.next(); // {value: 2, done: false} counter1.next(); // {value: undefined, done: true} counter2.next(); // {value: 1, done: false} counter2.next(); // {value: 2, done: false} counter2.next(); // {value: 3, done: false} // ...infinitely
Ví dụ xuất khẩu: console.log("Hello, World!");0 Ví dụ nhập khẩu: console.log("Hello, World!");1 Ví dụ nâng cao hơn [Chỉnh sửa][edit]Mã mẫu này hiển thị các tính năng JavaScript khác nhau. console.log("Hello, World!");2 Đầu ra sau phải được hiển thị trong cửa sổ trình duyệt. console.log("Hello, World!");3 Security[edit][edit]JavaScript và DOM cung cấp tiềm năng cho các tác giả độc hại để cung cấp các tập lệnh để chạy trên máy khách qua web. Các tác giả trình duyệt giảm thiểu rủi ro này bằng hai hạn chế. Đầu tiên, các tập lệnh chạy trong hộp cát trong đó chúng chỉ có thể thực hiện các hành động liên quan đến web, chứ không phải các tác vụ lập trình có mục đích chung như tạo tệp. Thứ hai, các tập lệnh bị hạn chế bởi chính sách đồng nghĩa: Các tập lệnh từ một trang web không có quyền truy cập vào thông tin như tên người dùng, mật khẩu hoặc cookie được gửi đến một trang web khác. Hầu hết các lỗi bảo mật liên quan đến JavaScript là vi phạm chính sách gốc giống nhau hoặc hộp cát. Có các tập hợp con của JavaScript chung ADSAFE, ECMAscript (SES) an toàn cung cấp mức độ bảo mật lớn hơn, đặc biệt là trên mã được tạo bởi các bên thứ ba (như quảng cáo). [77] [78] Công cụ đóng cửa là một dự án khác để nhúng an toàn và cách ly JavaScript của bên thứ ba và HTML. [79] Chính sách bảo mật nội dung là phương pháp dự định chính để đảm bảo rằng chỉ có mã đáng tin cậy được thực thi trên một trang web. Các lỗ hổng chéo trang [Chỉnh sửa][edit]Một vấn đề bảo mật liên quan đến JavaScript phổ biến là kịch bản chéo trang (XSS), vi phạm chính sách đồng nghĩa. Các lỗ hổng XSS xảy ra khi kẻ tấn công có thể gây ra trang web đích, chẳng hạn như trang web ngân hàng trực tuyến, bao gồm một kịch bản độc hại trong trang web được trình bày cho nạn nhân. Kịch bản trong ví dụ này sau đó có thể truy cập vào ứng dụng ngân hàng với các đặc quyền của nạn nhân, có khả năng tiết lộ thông tin bí mật hoặc chuyển tiền mà không cần sự cho phép của nạn nhân. Một giải pháp cho các lỗ hổng XSS là sử dụng HTML Escaping bất cứ khi nào hiển thị dữ liệu không tin cậy. Một số trình duyệt bao gồm bảo vệ một phần chống lại các cuộc tấn công XSS được phản ánh, trong đó kẻ tấn công cung cấp một URL bao gồm cả kịch bản độc hại. Tuy nhiên, ngay cả người dùng của các trình duyệt đó cũng dễ bị các cuộc tấn công XSS khác, chẳng hạn như những người được lưu trữ trong cơ sở dữ liệu. Chỉ thiết kế chính xác các ứng dụng web ở phía máy chủ có thể ngăn chặn hoàn toàn XSS. Các lỗ hổng XSS cũng có thể xảy ra do các lỗi thực hiện của các tác giả trình duyệt. [80] Một lỗ hổng chéo khác là giả mạo yêu cầu chéo (CSRF). Trong CSRF, mã trên trang web của kẻ tấn công sẽ lừa trình duyệt của nạn nhân thực hiện các hành động mà người dùng không có ý định tại một trang web mục tiêu (như chuyển tiền tại ngân hàng). Khi các trang web mục tiêu chỉ dựa vào cookie để xác thực yêu cầu, các yêu cầu có nguồn gốc từ mã trên trang web của kẻ tấn công có thể mang thông tin đăng nhập hợp lệ tương tự của người dùng khởi xướng. Nói chung, giải pháp cho CSRF là yêu cầu giá trị xác thực trong trường biểu mẫu ẩn và không chỉ trong cookie, để xác thực bất kỳ yêu cầu nào có thể có hiệu ứng lâu dài. Kiểm tra tiêu đề giới thiệu HTTP cũng có thể giúp đỡ. "Hijacking JavaScript" là một loại tấn công CSRF trong đó thẻ let counter = (function() { let i = 0; // Private property return { // Public methods get: function() { alert(i); }, set: function(value) { i = value; }, increment: function() { alert(++i); } }; })(); // Module counter.get(); // Returns 0 counter.set(6); counter.increment(); // Returns 7 counter.increment(); // Returns 82 trên trang web của kẻ tấn công khai thác một trang trên trang web của nạn nhân trả về thông tin cá nhân như JSON hoặc JavaScript. Các giải pháp có thể bao gồm:
Nỗi tin sai vào khách hàng [Chỉnh sửa][edit]Các nhà phát triển của các ứng dụng máy khách-máy chủ phải nhận ra rằng các máy khách không đáng tin cậy có thể nằm dưới sự kiểm soát của những kẻ tấn công. Tác giả ứng dụng không thể cho rằng mã JavaScript của họ sẽ chạy như dự định (hoặc hoàn toàn) vì bất kỳ bí mật nào được nhúng trong mã có thể được trích xuất bởi một đối thủ xác định. Một số hàm ý là:
Niềm tin không đúng chỗ cho các nhà phát triển [chỉnh sửa][edit]Các hệ thống quản lý gói như NPM và Bower là phổ biến với các nhà phát triển JavaScript. Các hệ thống như vậy cho phép nhà phát triển dễ dàng quản lý các phụ thuộc của chương trình vào các thư viện chương trình của các nhà phát triển khác. Các nhà phát triển tin tưởng rằng những người bảo trì các thư viện sẽ giữ cho họ an toàn và cập nhật, nhưng điều đó không phải lúc nào cũng đúng. Một lỗ hổng đã xuất hiện vì sự tin tưởng mù quáng này. Các thư viện tin cậy có thể có các bản phát hành mới khiến các lỗi hoặc lỗ hổng xuất hiện trong tất cả các chương trình dựa trên các thư viện. Ngược lại, một thư viện có thể không phù hợp với các lỗ hổng đã biết trong tự nhiên. Trong một nghiên cứu được thực hiện xem xét một mẫu gồm 133.000 trang web, các nhà nghiên cứu đã tìm thấy 37% các trang web bao gồm một thư viện có ít nhất một lỗ hổng đã biết. [83] "Độ trễ trung bình giữa phiên bản thư viện lâu đời nhất được sử dụng trên mỗi trang web và phiên bản mới nhất có sẵn của thư viện đó là 1.177 ngày ở Alexa và sự phát triển của một số thư viện vẫn đang được sử dụng tích cực từ nhiều năm trước." [83] Một khả năng khác là người bảo trì của một thư viện có thể loại bỏ hoàn toàn thư viện. Điều này xảy ra vào tháng 3 năm 2016 khi Azer Koçulu gỡ kho lưu trữ của mình khỏi NPM. Điều này khiến hàng chục ngàn chương trình và trang web tùy thuộc vào thư viện của anh ta bị phá vỡ. [84] [85] Trình duyệt và lỗi mã hóa plugin [Chỉnh sửa][edit]JavaScript cung cấp một giao diện cho một loạt các khả năng trình duyệt, một số trong đó có thể có các lỗ hổng như tràn bộ đệm. Những sai sót này có thể cho phép kẻ tấn công viết các tập lệnh sẽ chạy bất kỳ mã nào họ muốn trên hệ thống của người dùng. Mã này không phải bằng bất kỳ phương tiện nào giới hạn trong một ứng dụng JavaScript khác. Ví dụ, khai thác ghi đè bộ đệm có thể cho phép kẻ tấn công có quyền truy cập vào API của hệ điều hành với các đặc quyền của siêu người dùng. Những sai sót này đã ảnh hưởng đến các trình duyệt chính bao gồm Firefox, [86] Internet Explorer, [87] và Safari. [88] Các plugin, chẳng hạn như Trình phát video, Adobe Flash và phạm vi điều khiển hoạt động rộng được bật theo mặc định trong Microsoft Internet Explorer, cũng có thể bị khai thác thông qua JavaScript (các lỗ hổng như vậy đã được khai thác trong quá khứ). [89] [90] Trong Windows Vista, Microsoft đã cố gắng ngăn chặn các rủi ro của các lỗi như tràn bộ đệm bằng cách chạy quy trình Internet Explorer với các đặc quyền hạn chế. [91] Google Chrome tương tự giới hạn các trình kết xuất trang của mình với "hộp cát" của riêng họ. Lỗi triển khai hộp cát [Chỉnh sửa][edit]Trình duyệt web có khả năng chạy JavaScript bên ngoài hộp cát, với các đặc quyền cần thiết, ví dụ, tạo hoặc xóa các tệp. Các đặc quyền như vậy không được dự định sẽ được cấp cho mã từ web. Việc cấp không chính xác các đặc quyền cho JavaScript từ Web đã đóng một vai trò trong các lỗ hổng trong cả Internet Explorer [92] và Firefox. [93] Trong Windows XP Service Pack 2, Microsoft đã giải phóng các đặc quyền của JScript trong Internet Explorer. [94] Microsoft Windows cho phép các tệp nguồn JavaScript trên ổ cứng của máy tính được khởi chạy dưới dạng các chương trình không có mục đích chung, không được sử dụng (xem: Máy chủ Windows Script). Điều này làm cho JavaScript (như VBScript) trở thành một vectơ khả thi về mặt lý thuyết cho một con ngựa thành Troia, mặc dù ngựa trojan JavaScript là không phổ biến trong thực tế. [95] [Xác minh thất bại]failed verification] Lỗ hổng phần cứng [Chỉnh sửa][edit]Vào năm 2015, một triển khai bằng chứng về khái niệm dựa trên JavaScript của một cuộc tấn công Rowhammer đã được mô tả trong một bài báo bởi các nhà nghiên cứu bảo mật. [96] [97] [98] [99] Vào năm 2017, một cuộc tấn công dựa trên JavaScript thông qua trình duyệt đã được chứng minh rằng có thể bỏ qua ASLR. Nó được gọi là "Aslr⊕cache" hoặc anc. [100] [101] Vào năm 2018, bài báo đã công bố các cuộc tấn công của Spectre chống lại việc thực hiện đầu cơ trong Intel và các bộ xử lý khác bao gồm việc triển khai JavaScript. [102] Công cụ phát triển [Chỉnh sửa][edit]Các công cụ quan trọng đã phát triển với ngôn ngữ.
[edit]edit]Java[edit][edit]Một quan niệm sai lầm phổ biến là JavaScript giống như Java. Cả hai thực sự có một cú pháp giống C (ngôn ngữ C là ngôn ngữ tổ tiên chung ngay lập tức nhất của họ). Chúng cũng thường được hộp cát (khi được sử dụng bên trong trình duyệt) và JavaScript được thiết kế với cú pháp và thư viện tiêu chuẩn của Java. Cụ thể, tất cả các từ khóa Java được dành riêng trong JavaScript gốc, Thư viện tiêu chuẩn của JavaScript tuân theo các quy ước đặt tên của Java và các đối tượng function* rawCounter() { yield 1; yield 2; } function* dynamicCounter() { let count = 0; while(true) { // It is not recommended to utilize while true loops in most cases. yield ++count; } } // Instances const counter1 = rawCounter(); const counter2 = dynamicCounter(); // Implementation counter1.next(); // {value: 1, done: false} counter1.next(); // {value: 2, done: false} counter1.next(); // {value: undefined, done: true} counter2.next(); // {value: 1, done: false} counter2.next(); // {value: 2, done: false} counter2.next(); // {value: 3, done: false} // ...infinitely3 và function* rawCounter() { yield 1; yield 2; } function* dynamicCounter() { let count = 0; while(true) { // It is not recommended to utilize while true loops in most cases. yield ++count; } } // Instances const counter1 = rawCounter(); const counter2 = dynamicCounter(); // Implementation counter1.next(); // {value: 1, done: false} counter1.next(); // {value: 2, done: false} counter1.next(); // {value: undefined, done: true} counter2.next(); // {value: 1, done: false} counter2.next(); // {value: 2, done: false} counter2.next(); // {value: 3, done: false} // ...infinitely4 của JavaScript dựa trên các lớp từ Java 1.0. [105] Cả Java và JavaScript đều xuất hiện lần đầu tiên vào năm 1995, nhưng Java được phát triển bởi James Gosling của Sun Microsystems và JavaScript của Brendan Eich của Netscape Communications. Sự khác biệt giữa hai ngôn ngữ nổi bật hơn sự tương đồng của chúng. Java có gõ tĩnh, trong khi gõ của JavaScript là động. Java được tải từ mã byte được biên dịch, trong khi JavaScript được tải dưới dạng mã nguồn có thể đọc được của con người. Các đối tượng của Java là dựa trên lớp, trong khi JavaScript dựa trên nguyên mẫu. Cuối cùng, Java đã không hỗ trợ lập trình chức năng cho đến khi Java 8, trong khi JavaScript đã làm như vậy ngay từ đầu, bị ảnh hưởng bởi sơ đồ. JSON[edit][edit]JSON, hoặc ký hiệu đối tượng JavaScript, là một định dạng trao đổi dữ liệu có mục đích chung được định nghĩa là một tập hợp con của cú pháp theo nghĩa đen của đối tượng JavaScript. TypeScript[edit][edit]TypeScript (TS) là một biến thể được gõ chặt chẽ của JavaScript. TS khác nhau bằng cách giới thiệu các chú thích loại cho các biến và hàm và giới thiệu một ngôn ngữ loại để mô tả các loại trong JS. Mặt khác, TS chia sẻ nhiều tính năng tương tự như JS, để cho phép nó dễ dàng được chuyển sang JS để chạy phía máy khách và tương tác với mã JS khác. [106] WebAssembly[edit][edit]Kể từ năm 2017, các trình duyệt web đã hỗ trợ WebAssugging, định dạng nhị phân cho phép công cụ JavaScript thực hiện các phần quan trọng hiệu suất của các tập lệnh trang web gần với tốc độ gốc. [107] Mã WebAssugging chạy trong cùng một hộp cát với mã JavaScript thông thường. ASM.JS là một tập hợp con của JavaScript đóng vai trò là tiền thân của WebAssugging. [108] Transpilers[edit][edit]JavaScript là ngôn ngữ phía máy khách thống trị của Web và nhiều trang web nặng kịch bản. Do đó, các bộ chuyển đổi đã được tạo để chuyển đổi mã được viết bằng các ngôn ngữ khác, có thể hỗ trợ quá trình phát triển. [34] References[edit][edit]
Đọc thêm [Chỉnh sửa][edit]
Liên kết bên ngoài [Chỉnh sửa][edit]Tệp âm thanh này được tạo từ bản sửa đổi của bài viết này ngày 20 & nbsp; August & NBSP; 2013 và không phản ánh các chỉnh sửa tiếp theo.
JavaScript được đặt tên như thế nào?Các phiên bản đầu của JavaScript được gọi là Mocha. Không lâu sau khi một nguyên mẫu Mocha được đưa vào NetScape Communicator (tháng 5 năm 1995), nó được đổi tên thành Livescript, hoàn toàn vì thế giới sống tốt hơn để tiếp thị. Nó được đổi tên lại vào tháng 12 cùng năm, lần này là JavaScript.
Tên khác của JavaScript là gì?"Ecmascript" là thuật ngữ cho tiêu chuẩn ngôn ngữ, nhưng "ecmascript" và "javascript" có thể được sử dụng thay thế cho nhau.Ngôn ngữ cốt lõi này cũng được sử dụng trong môi trường không phải trình duyệt, ví dụ trong nút.JS.ECMAScript" is the term for the language standard, but "ECMAScript" and "JavaScript" can be used interchangeably. This core language is also used in non-browser environments, for example in Node. js.
Có phải JavaScript được gọi là Mocha?JavaScript ban đầu được phát triển bởi Brendan Eich của Netscape Communications Corporation dưới cái tên Mocha, sau đó là Livescript, và cuối cùng được đổi tên thành JavaScript., then LiveScript, and finally renamed to JavaScript.
Tên ban đầu của JavaScript Livescript Escript Mocha JavaScript là gì?Ban đầu, nó không được gọi là JavaScript;Nó đã được đặt tên là Mocha.Cái tên Mocha được chọn bởi Marc Andreessen, một người sáng lập Netscape.Cái tên được đổi thành Livescript vào tháng 9 năm 1995. Trong cùng năm, tháng 12, nó đã nhận được giấy phép nhãn hiệu từ Sun và cái tên JavaScript xuất hiện trong bức tranh.Mocha. The name Mocha was chosen by Marc Andreessen, a Netscape founder. The name was changed to LiveScript in September 1995. In the same year, December, it received a trademark license from Sun and the name JavaScript came into the picture. |