Hướng dẫn javascript info pdf free download - tải xuống miễn phí thông tin javascript pdf

Permalink

bậc thầy

Chuyển nhánh/thẻ

Không thể tải các nhánh

Không có gì để hiển thị

{{refname}}

Tên đã được sử dụng

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh GIT chấp nhận cả tên thẻ và tên chi nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi bất ngờ. Bạn có chắc là bạn muốn tạo chi nhánh này?

Đi nộp

  • Đi nộp
  • Sao chép đường dẫn
  • Sao chép permalink

Không thể lấy lại những người đóng góp tại thời điểm này

3,65 MB

Tải xuống

  • Mở với máy tính để bàn
  • Tải xuống
  • Xóa tài liệu

Xin lỗi, có lỗi xảy ra. Tải lại?

Xin lỗi, chúng tôi không thể hiển thị tệp này.

Xin lỗi, tệp này không hợp lệ nên nó không thể được hiển thị.

Phần 1 Ngôn ngữ JavaScript Ilya Kantor được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại https: // jav

Lượt xem 6.942 lượt tải xuống 2.403 kích thước tệp 15MB Downloads 2,403 File size 15MB

Báo cáo DMCA / Bản quyền

TẢI TẬP TIN

Đề xuất câu chuyện

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại https://javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"(\. "\\\\ \\" ".. '; cảnh báo (str.match (reg)); // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"(\. "\\\\ \\" ".. '; cảnh báo (str.match (reg)); // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Để xây dựng

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"(\. "\\\\ \\" ".. '; cảnh báo (str.match (reg)); // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Để xây dựng

Tìm thẻ đầy đủ Khởi động mẫu là rõ ràng :). Trong hành động: hãy để reg = /|\s.*?>)/g; cảnh báo ('' .match (reg)); //,

Thông tin JavaScript có tốt cho việc học không?

JavaScript là ngôn ngữ quan trọng nhất bạn cần học như một nhà phát triển frontend. Đó là ngôn ngữ đầu tiên tuyệt vời cho các nhà phát triển web tìm hiểu vì: các ứng dụng web rất năng động vì JavaScript.

JavaScript có miễn phí không?

JavaScript là miễn phí để sử dụng cho tất cả mọi người.

Bạn có thể tải xuống JavaScript ở đâu?

Trình cài đặt JavaScript SyncFusion có thể được tải xuống từ trang web SyncFusion.com. Bạn có thể tải xuống trình cài đặt được cấp phép hoặc thử trình cài đặt thử nghiệm của chúng tôi tùy thuộc vào giấy phép của bạn.

JavaScript có khó học không?

Có thể cho rằng, JavaScript là một trong những ngôn ngữ lập trình dễ học nhất, vì vậy nó phục vụ như một ngôn ngữ đầu tiên tuyệt vời cho bất kỳ ai thương hiệu mới với mã hóa. Ngay cả các dòng phức tạp nhất của mã JavaScript cũng có thể được viết từng cái một, trong các đoạn. Nó cũng có thể được kiểm tra trong trình duyệt web cùng một lúc.

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại https://javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Giới thiệu ●

Giới thiệu về JavaScript

Hướng dẫn và thông số kỹ thuật

Mã biên tập mã

Ban điêu khiển cải tiên hơn

Nguyên tắc cơ bản của JavaScript ●

Chào thế giới!

Cấu trúc mã

Chế độ hiện đại, "Sử dụng nghiêm ngặt"

Biến

Loại dữ liệu

Để xây dựng

Tìm thẻ đầy đủ Khởi động mẫu là rõ ràng :). Trong hành động: hãy để reg = /|\s.*?>)/g; cảnh báo ('' .match (reg)); //,

Thông tin JavaScript có tốt cho việc học không?

JavaScript là ngôn ngữ quan trọng nhất bạn cần học như một nhà phát triển frontend. Đó là ngôn ngữ đầu tiên tuyệt vời cho các nhà phát triển web tìm hiểu vì: các ứng dụng web rất năng động vì JavaScript.

JavaScript có miễn phí không?

JavaScript là miễn phí để sử dụng cho tất cả mọi người.

Bạn có thể tải xuống JavaScript ở đâu?

Trình cài đặt JavaScript SyncFusion có thể được tải xuống từ trang web SyncFusion.com. Bạn có thể tải xuống trình cài đặt được cấp phép hoặc thử trình cài đặt thử nghiệm của chúng tôi tùy thuộc vào giấy phép của bạn.

JavaScript có khó học không?

Có thể cho rằng, JavaScript là một trong những ngôn ngữ lập trình dễ học nhất, vì vậy nó phục vụ như một ngôn ngữ đầu tiên tuyệt vời cho bất kỳ ai thương hiệu mới với mã hóa. Ngay cả các dòng phức tạp nhất của mã JavaScript cũng có thể được viết từng cái một, trong các đoạn. Nó cũng có thể được kiểm tra trong trình duyệt web cùng một lúc.

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại https://javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Giới thiệu ●

Giới thiệu về JavaScript

Hướng dẫn và thông số kỹ thuật

Mã biên tập mã

Ban điêu khiển cải tiên hơn

Nguyên tắc cơ bản của JavaScript ●

Chào thế giới!

Cấu trúc mã

Chế độ hiện đại, "Sử dụng nghiêm ngặt"

Biến

Loại dữ liệu

Nhập chuyển đổi

Người vận hành

So sánh

Tương tác: cảnh báo, nhắc nhở, xác nhận

Các nhà khai thác có điều kiện: Nếu, '?'

Toán tử logic

Vòng lặp: Trong khi và cho

Câu lệnh "Switch"

Chức năng

Biểu thức chức năng và mũi tên

JavaScript đặc biệt

Chất lượng mã ●

Gỡ lỗi trong Chrome

Phong cách mã hóa

Bình luận

Mã ninja

Thử nghiệm tự động với Mocha

Polyfills

Đối tượng: những điều cơ bản ●

Các đối tượng

Thu gom rác thải

Loại ký hiệu

Phương thức đối tượng, "cái này"

Phản đối chuyển đổi nguyên thủy

Hứa hẹn

Microtasks

Async/chờ đợi

Máy phát điện, Lặp lại nâng cao ●

Máy phát điện

Máy lặp và máy phát không đồng bộ

Mô -đun ●

Mô -đun, Giới thiệu

Xuất khẩu và nhập khẩu

Nhập khẩu động

Linh tinh ●

Proxy và phản ánh

Eval: Chạy chuỗi mã

Ở đây chúng tôi tìm hiểu JavaScript, bắt đầu từ đầu và tiếp tục các khái niệm nâng cao như OOP. Chúng tôi tập trung vào chính ngôn ngữ ở đây, với tối thiểu các ghi chú cụ thể về môi trường.

Giới thiệu về ngôn ngữ JavaScript và môi trường để phát triển với nó.

Giới thiệu về JavaScript, hãy để Lừa xem những gì rất đặc biệt về JavaScript, những gì chúng ta có thể đạt được với nó và những công nghệ khác chơi tốt với nó.

JavaScript là gì? JavaScript ban đầu được tạo ra để làm cho các trang web còn sống. Các chương trình trong ngôn ngữ này được gọi là tập lệnh. Chúng có thể được viết ngay trong một trang web HT HTML và chạy tự động khi tải trang. Các tập lệnh được cung cấp và thực thi dưới dạng văn bản đơn giản. Họ không cần sự chuẩn bị hoặc biên dịch đặc biệt để chạy. Trong khía cạnh này, JavaScript rất khác với một ngôn ngữ khác gọi là Java

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

Khỉ nhện

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

Khỉ nhện

- trong Chrome và Opera. 

- Trong Firefox.

Có những tên mã khác như Trident Trident và và chakra, cho các phiên bản khác nhau của IE, Chak Chakracore, cho Microsoft Edge, Hồi Nitro, và Squirelfish, cho Safari, v.v.

Các thuật ngữ trên là tốt để nhớ vì chúng được sử dụng trong các bài viết của nhà phát triển trên internet. Chúng tôi cũng sẽ sử dụng chúng. Chẳng hạn, nếu tính năng X được hỗ trợ bởi V8, thì nó có thể hoạt động trong Chrome và Opera.

Các tab/cửa sổ khác nhau thường không biết về nhau. Đôi khi, họ làm, ví dụ khi một cửa sổ sử dụng JavaScript để mở cái khác. Nhưng ngay cả trong trường hợp này, JavaScript từ một trang có thể không truy cập vào trang khác nếu chúng đến từ các trang web khác nhau (từ một miền, giao thức hoặc cổng khác nhau). Đây được gọi là chính sách gốc của người Viking. Để làm việc xung quanh đó, cả hai trang phải đồng ý trao đổi dữ liệu và chứa mã JavaScript đặc biệt xử lý nó. Chúng tôi bao gồm điều đó trong hướng dẫn. Giới hạn này, một lần nữa, đối với sự an toàn của người dùng. Một trang từ http://anysite.com mà người dùng đã mở không thể truy cập tab Trình duyệt khác với URL http://gmail.com và đánh cắp thông tin từ đó.

JavaScript có thể dễ dàng liên lạc qua mạng đến máy chủ nơi trang hiện tại đến từ. Nhưng khả năng nhận dữ liệu từ các trang web/miền khác bị tê liệt. Mặc dù có thể, nó đòi hỏi phải thỏa thuận rõ ràng (được thể hiện trong các tiêu đề HTTP) từ phía từ xa. Một lần nữa, đó là một giới hạn an toàn.

Các giới hạn như vậy không tồn tại nếu JavaScript được sử dụng bên ngoài trình duyệt, ví dụ trên máy chủ. Các trình duyệt hiện đại cũng cho phép plugin/tiện ích mở rộng có thể yêu cầu các quyền mở rộng.

Điều gì làm cho JavaScript độc đáo? Có ít nhất ba điều tuyệt vời về JavaScript:

Tích hợp đầy đủ với HTML/CSS.

Những điều đơn giản được thực hiện đơn giản.

Hỗ trợ bởi tất cả các trình duyệt chính và được bật theo mặc định.

JavaScript là công nghệ trình duyệt duy nhất kết hợp ba điều này. Đó là những gì làm cho JavaScript độc đáo. Đó là lý do tại sao nó là công cụ phổ biến nhất để tạo giao diện trình duyệt. Mặc dù có kế hoạch học một công nghệ mới, nhưng nó có lợi để kiểm tra quan điểm của nó. Vì vậy, hãy để Lừa chuyển sang các xu hướng hiện đại ảnh hưởng đến nó, bao gồm các ngôn ngữ mới và khả năng trình duyệt.

Các ngôn ngữ trên mạng JavaScript Cú pháp của JavaScript không phù hợp với mọi người. Những người khác nhau muốn có các tính năng khác nhau. Điều đó được mong đợi, bởi vì các dự án và yêu cầu là khác nhau đối với tất cả mọi người. Vì vậy, gần đây, rất nhiều ngôn ngữ mới xuất hiện, được chuyển (chuyển đổi) thành JavaScript trước khi chúng chạy trong trình duyệt. Các công cụ hiện đại làm cho việc chuyển đổi rất nhanh và minh bạch, thực sự cho phép các nhà phát triển mã hóa bằng ngôn ngữ khác và tự động chuyển đổi nó dưới mui xe. Ví dụ về các ngôn ngữ đó: ●

CoffeeScript  là một loại đường cú pháp của người Viking cho JavaScript. Nó giới thiệu cú pháp ngắn hơn, cho phép chúng tôi viết mã rõ ràng hơn và chính xác hơn. Thông thường, Ruby Devs thích nó. TypeScript tập trung vào việc thêm dữ liệu nghiêm ngặt của nhóm gõ để đơn giản hóa sự phát triển và hỗ trợ của các hệ thống phức tạp. Nó được phát triển bởi Microsoft. lưu lượng

Cũng thêm gõ dữ liệu, nhưng theo một cách khác. Được phát triển bởi Facebook.

DART là một ngôn ngữ độc lập có động cơ riêng chạy trong môi trường không phải là trình duyệt (như ứng dụng di động), nhưng cũng có thể được chuyển sang JavaScript. Được phát triển bởi Google.

Có nhiều. Tất nhiên, ngay cả khi chúng ta sử dụng một trong những ngôn ngữ được truyền, chúng ta cũng nên biết JavaScript để thực sự hiểu những gì chúng ta đang làm.

Tóm tắt ●

JavaScript ban đầu được tạo ra như một ngôn ngữ chỉ dành cho trình duyệt, nhưng hiện cũng được sử dụng trong nhiều môi trường khác. Ngày nay, JavaScript có một vị trí duy nhất là ngôn ngữ trình duyệt được điều chỉnh rộng rãi nhất với tích hợp đầy đủ với HTML/CSS. Có nhiều ngôn ngữ nhận được các ngôn ngữ đã chuyển sang JavaScript và cung cấp một số tính năng nhất định. Bạn nên xem xét chúng, ít nhất là một thời gian ngắn, sau khi thành thạo JavaScript.

Hướng dẫn và thông số kỹ thuật Cuốn sách này là một hướng dẫn. Nó nhằm mục đích giúp bạn dần dần học ngôn ngữ. Nhưng một khi bạn đã quen thuộc với những điều cơ bản, bạn sẽ cần các nguồn khác.

Sự chỉ rõ

Thông số kỹ thuật ECMA-262 chứa thông tin chuyên sâu, chi tiết và chính thức nhất về JavaScript. Nó định nghĩa ngôn ngữ. Nhưng lúc đầu được chính thức hóa, nó khó hiểu. Vì vậy, nếu bạn cần nguồn thông tin đáng tin cậy nhất về các chi tiết ngôn ngữ, đặc điểm kỹ thuật là nơi phù hợp. Nhưng nó không sử dụng hàng ngày. Dự thảo mới nhất là tại https://tc39.es/ecma262/

Cũng thêm gõ dữ liệu, nhưng theo một cách khác. Được phát triển bởi Facebook.

DART là một ngôn ngữ độc lập có động cơ riêng chạy trong môi trường không phải là trình duyệt (như ứng dụng di động), nhưng cũng có thể được chuyển sang JavaScript. Được phát triển bởi Google.

Có nhiều. Tất nhiên, ngay cả khi chúng ta sử dụng một trong những ngôn ngữ được truyền, chúng ta cũng nên biết JavaScript để thực sự hiểu những gì chúng ta đang làm.

Tóm tắt ●

.

Mặc dù, nó thường tốt nhất để sử dụng tìm kiếm trên internet. Chỉ cần sử dụng MD MDN [thuật ngữ] trong truy vấn, ví dụ: https://google.com/search?q=mdn+ParseInt để tìm kiếm chức năng ParseInt. ●

MSDN - Hướng dẫn sử dụng Microsoft với nhiều thông tin, bao gồm JavaScript (thường giới thiệu là JScript). Nếu một người cần một cái gì đó cụ thể cho Internet Explorer, tốt hơn là hãy đến đó: http://msdn.microsoft.com/. Ngoài ra, chúng ta có thể sử dụng một tìm kiếm trên internet với các cụm từ, chẳng hạn như REGEXP MSDN, hoặc REGEXP MSDN JScript.

Hỗ trợ tính năng JavaScript là một ngôn ngữ đang phát triển, các tính năng mới được thêm vào thường xuyên. Để xem sự hỗ trợ của họ giữa các động cơ dựa trên trình duyệt và các động cơ khác, hãy xem: ●

http://caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: http://caniuse.com/#feat=cryptography. https://kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng (hoặc trang này) cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE (môi trường phát triển tích hợp) đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án (có thể là nhiều tệp), cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án (không chỉ tệp mở) và tích hợp với hệ thống quản lý phiên bản (như GIT), môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

Visual Studio Code

http://caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: http://caniuse.com/#feat=cryptography. https://kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng (hoặc trang này) cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE (môi trường phát triển tích hợp) đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án (có thể là nhiều tệp), cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án (không chỉ tệp mở) và tích hợp với hệ thống quản lý phiên bản (như GIT), môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

http://caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: http://caniuse.com/#feat=cryptography. https://kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

http://caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: http://caniuse.com/#feat=cryptography. https://kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

http://caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: http://caniuse.com/#feat=cryptography. https://kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng (hoặc trang này) cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE (môi trường phát triển tích hợp) đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án (có thể là nhiều tệp), cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án (không chỉ tệp mở) và tích hợp với hệ thống quản lý phiên bản (như GIT), môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

Visual Studio Code

BRIAL Webstorm

(đa nền tảng, miễn phí).

Google Chrome Mở lỗi trang.html. Có một lỗi trong mã JavaScript trên đó. Nó ẩn giấu từ một khách truy cập thường xuyên, vì vậy, hãy để các công cụ của nhà phát triển mở để xem nó. Nhấn F12 hoặc, nếu bạn trên MAC, thì CMD+OPT+J. Các công cụ nhà phát triển sẽ mở trên tab Bảng điều khiển theo mặc định. Nó trông có vẻ như thế này:

Cái nhìn chính xác của các công cụ phát triển phụ thuộc vào phiên bản Chrome của bạn. Nó thay đổi theo thời gian nhưng nên tương tự. ●

Ở đây chúng ta có thể thấy thông báo lỗi màu đỏ. Trong trường hợp này, kịch bản chứa một lệnh không xác định của Lalala. Ở bên phải, có một liên kết có thể nhấp đến lỗi nguồn.html: 12 với số dòng xảy ra lỗi.

Bên dưới thông báo lỗi, có một ký hiệu màu xanh>. Nó đánh dấu một dòng lệnh của người Viking, nơi chúng ta có thể nhập các lệnh JavaScript. Nhấn Enter để chạy chúng (SHIFT+ENTER vào các lệnh đa dòng đầu vào). Bây giờ chúng ta có thể thấy lỗi, và điều đó đủ để bắt đầu. Chúng tôi sẽ quay trở lại với các công cụ phát triển sau này và bao gồm gỡ lỗi sâu hơn trong chương trình gỡ lỗi trong Chrome.

Firefox, Edge và các trình duyệt khác, hầu hết các trình duyệt khác sử dụng F12 để mở các công cụ phát triển. Cái nhìn và cảm giác của họ là khá giống nhau. Khi bạn biết cách sử dụng một trong những công cụ này (bạn có thể bắt đầu với Chrome), bạn có thể dễ dàng chuyển sang một công cụ khác.

Safari Safari (Trình duyệt MAC, không được Windows/Linux hỗ trợ) là một chút đặc biệt ở đây. Chúng ta cần kích hoạt menu phát triển trực tuyến trước tiên. Tùy chọn mở và đi đến khung Advanced Advanced. Có một hộp kiểm ở phía dưới:

Bây giờ CMD+OPT+C có thể chuyển đổi bảng điều khiển. Ngoài ra, lưu ý rằng mục menu hàng đầu mới có tên là Phát triển đã xuất hiện. Nó có nhiều lệnh và tùy chọn.

Đầu vào đa dòng thường, khi chúng ta đặt một dòng mã vào bảng điều khiển, sau đó nhấn Enter, nó thực thi. Để chèn nhiều dòng, nhấn Shift+Enter.

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Ở đây chúng ta có thể thấy thông báo lỗi màu đỏ. Trong trường hợp này, kịch bản chứa một lệnh không xác định của Lalala. Ở bên phải, có một liên kết có thể nhấp đến lỗi nguồn.html: 12 với số dòng xảy ra lỗi.

Bên dưới thông báo lỗi, có một ký hiệu màu xanh>. Nó đánh dấu một dòng lệnh của người Viking, nơi chúng ta có thể nhập các lệnh JavaScript. Nhấn Enter để chạy chúng (SHIFT+ENTER vào các lệnh đa dòng đầu vào). Bây giờ chúng ta có thể thấy lỗi, và điều đó đủ để bắt đầu. Chúng tôi sẽ quay trở lại với các công cụ phát triển sau này và bao gồm gỡ lỗi sâu hơn trong chương trình gỡ lỗi trong Chrome.

Firefox, Edge và các trình duyệt khác, hầu hết các trình duyệt khác sử dụng F12 để mở các công cụ phát triển. Cái nhìn và cảm giác của họ là khá giống nhau. Khi bạn biết cách sử dụng một trong những công cụ này (bạn có thể bắt đầu với Chrome), bạn có thể dễ dàng chuyển sang một công cụ khác.

Safari Safari (Trình duyệt MAC, không được Windows/Linux hỗ trợ) là một chút đặc biệt ở đây. Chúng ta cần kích hoạt menu phát triển trực tuyến trước tiên. Tùy chọn mở và đi đến khung Advanced Advanced. Có một hộp kiểm ở phía dưới:

Bây giờ CMD+OPT+C có thể chuyển đổi bảng điều khiển. Ngoài ra, lưu ý rằng mục menu hàng đầu mới có tên là Phát triển đã xuất hiện. Nó có nhiều lệnh và tùy chọn.

Đầu vào đa dòng thường, khi chúng ta đặt một dòng mã vào bảng điều khiển, sau đó nhấn Enter, nó thực thi. Để chèn nhiều dòng, nhấn Shift+Enter.

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Chúng có thể được mở với F12 cho hầu hết các trình duyệt trên Windows. Chrome cho Mac cần CMD+OPT+J, Safari: CMD+OPT+C (cần bật trước).

Bây giờ chúng ta đã sẵn sàng môi trường. Trong phần tiếp theo, chúng tôi sẽ xuống JavaScript.

Các nguyên tắc cơ bản của JavaScript cho phép tìm hiểu các nguyên tắc cơ bản của việc xây dựng kịch bản.

Chào thế giới! Phần này của hướng dẫn là về JavaScript cốt lõi, chính ngôn ngữ. Sau đó, bạn sẽ tìm hiểu về Node.js và các nền tảng khác sử dụng nó. Nhưng chúng tôi cần một môi trường làm việc để chạy các kịch bản của chúng tôi và, vì cuốn sách này là trực tuyến, trình duyệt là một lựa chọn tốt. Chúng tôi sẽ giữ số lượng các lệnh dành riêng cho trình duyệt (như cảnh báo) ở mức tối thiểu để bạn không dành thời gian cho chúng nếu bạn có kế hoạch tập trung vào một môi trường khác (như Node.js). Chúng tôi tập trung vào JavaScript trong trình duyệt trong phần tiếp theo của hướng dẫn. Vì vậy, trước tiên, hãy để xem cách chúng tôi đính kèm tập lệnh vào một trang web. Đối với các môi trường phía máy chủ (như Node.js), bạn có thể thực thi tập lệnh bằng một lệnh như "Node my.js".

Các chương trình JavaScript của Tag script script có thể được đưa vào bất kỳ phần nào của tài liệu HTML với sự trợ giúp của

... sau kịch bản.

Các

Thủ thuật này được sử dụng trong JavaScript hiện đại. Những bình luận này đã ẩn mã JavaScript từ các trình duyệt cũ mà không biết cách xử lý

Ở đây, /path/to/script.js là một đường dẫn tuyệt đối đến tệp tập lệnh (từ root trang web). Bạn cũng có thể cung cấp một đường dẫn tương đối từ trang hiện tại. Chẳng hạn, src = "script.js" có nghĩa là một tệp "script.js" trong thư mục hiện tại. Chúng tôi cũng có thể cung cấp một URL đầy đủ. Ví dụ:

Để đính kèm một số tập lệnh, hãy sử dụng nhiều thẻ:

Xin lưu ý:

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Chúng có thể được mở với F12 cho hầu hết các trình duyệt trên Windows. Chrome cho Mac cần CMD+OPT+J, Safari: CMD+OPT+C (cần bật trước).

Bây giờ chúng ta đã sẵn sàng môi trường. Trong phần tiếp theo, chúng tôi sẽ xuống JavaScript.

Các nguyên tắc cơ bản của JavaScript cho phép tìm hiểu các nguyên tắc cơ bản của việc xây dựng kịch bản.

Để giải pháp

Hiển thị một cảnh báo với tầm quan trọng của tập lệnh bên ngoài: 5 Lấy giải pháp của nhiệm vụ trước đó cho thấy cảnh báo. Sửa đổi nó bằng cách trích xuất nội dung tập lệnh thành một tệp bên ngoài cảnh báo.js, nằm trong cùng một thư mục. Mở trang, đảm bảo rằng cảnh báo hoạt động. Để giải pháp

Cấu trúc mã Điều đầu tiên chúng tôi nghiên cứu là các khối xây dựng mã.

Các câu lệnh là cấu trúc cú pháp và các lệnh thực hiện các hành động. Chúng tôi đã thấy một tuyên bố, cảnh giác ('Xin chào, thế giới!'), Trong đó hiển thị thông điệp Hello Hello, World! Chúng tôi có thể có nhiều câu trong mã của chúng tôi như chúng tôi muốn. Các tuyên bố có thể được phân tách bằng một dấu chấm phẩy. Ví dụ: ở đây chúng tôi chia ra thế giới Hello Hello thế giới thành hai cảnh báo:

cảnh báo ('xin chào'); cảnh báo ('thế giới');

Thông thường, các câu lệnh được viết trên các dòng riêng biệt để làm cho mã dễ đọc hơn:

cảnh báo ('xin chào'); cảnh báo ('thế giới');

Thông thường, các câu lệnh được viết trên các dòng riêng biệt để làm cho mã dễ đọc hơn:

Bán kết Một dấu chấm phẩy có thể bị bỏ qua trong hầu hết các trường hợp khi tồn tại một dòng phá vỡ. Điều này cũng sẽ hoạt động:

cảnh báo ('xin chào') cảnh báo ('thế giới')

Ở đây, JavaScript diễn giải dòng phá vỡ như một dấu chấm phẩy ngầm của người Hồi giáo. Đây được gọi là chèn dấu chấm phẩy tự động. Trong hầu hết các trường hợp, một dòng mới ngụ ý một dấu chấm phẩy. Nhưng trong hầu hết các trường hợp, không có nghĩa là luôn luôn có nghĩa là người Viking! Có những trường hợp khi một dòng mới không có nghĩa là dấu chấm phẩy. Ví dụ:

cảnh báo (3 + 1 + 2);

Mã xuất ra 6 vì JavaScript không chèn các dấu chấm phẩy ở đây. Rõ ràng là nếu dòng kết thúc bằng một điểm cộng "+", thì đó là một biểu thức không hoàn chỉnh của người Hồi giáo, do đó, dấu chấm phẩy không bắt buộc. Và trong trường hợp này hoạt động như dự định. Nhưng có những tình huống mà JavaScript đã thất bại khi giả sử một dấu chấm phẩy nơi nó thực sự cần thiết. Lỗi xảy ra trong các trường hợp như vậy khá khó tìm và sửa chữa.

Một ví dụ về một lỗi

Nếu bạn tò mò muốn thấy một ví dụ cụ thể về một lỗi như vậy, hãy kiểm tra mã này:

[1, 2] .foreach (cảnh báo)

Không cần phải suy nghĩ về ý nghĩa của dấu ngoặc [] và foreach chưa. Chúng tôi sẽ nghiên cứu chúng sau. Hiện tại, chỉ cần nhớ kết quả của mã: nó hiển thị 1 sau đó 2. Bây giờ, hãy để thêm một cảnh báo trước mã và không hoàn thành nó bằng dấu chấm phẩy: cảnh báo ("Sẽ có lỗi") [1, 2] .foreach (ALERT)

Bây giờ nếu chúng ta chạy mã, chỉ cảnh báo đầu tiên được hiển thị và sau đó chúng ta có lỗi! Nhưng mọi thứ lại ổn nếu chúng ta thêm một dấu chấm phẩy sau cảnh báo: cảnh báo ("Tất cả bây giờ tốt"); [1, 2] .foreach (cảnh báo)

Bây giờ chúng tôi có tin nhắn hiện tại tất cả các loại tốt, sau đó là 1 và 2. Lỗi trong biến thể NO-Semeolon xảy ra vì JavaScript không giả sử dấu chấm phẩy trước khung vuông [...]. Vì vậy, vì dấu chấm phẩy không được tự động chèn, mã trong ví dụ đầu tiên được coi là một tuyên bố duy nhất. Ở đây, cách thức động cơ nhìn thấy nó:

cảnh báo ("Sẽ có một lỗi") [1, 2] .foreach (ALERT)

Nhưng nó nên là hai câu riêng biệt, không phải một. Một sự hợp nhất như vậy trong trường hợp này chỉ là sai, do đó lỗi. Điều này có thể xảy ra trong các tình huống khác. Chúng tôi khuyên bạn nên đặt dấu chấm phẩy giữa các tuyên bố ngay cả khi chúng được phân tách bằng các dòng mới. Quy tắc này được cộng đồng áp dụng rộng rãi. Hãy lưu ý một lần nữa - có thể bỏ qua các dấu chấm phẩy hầu hết thời gian. Nhưng nó an toàn hơn - đặc biệt là cho người mới bắt đầu - sử dụng chúng.

Nhận xét Khi thời gian trôi qua, các chương trình ngày càng trở nên phức tạp hơn. Nó trở nên cần thiết để thêm nhận xét mô tả những gì mã làm và tại sao. Nhận xét có thể được đưa vào bất kỳ nơi nào của một kịch bản. Họ không ảnh hưởng đến việc thực hiện nó vì động cơ chỉ đơn giản là bỏ qua chúng.

Nhận xét một dòng bắt đầu với hai ký tự chém về phía trước //. Phần còn lại của dòng là một bình luận. Nó có thể chiếm một dòng đầy đủ của riêng mình hoặc làm theo một tuyên bố. Như ở đây:

// Nhận xét này chiếm một dòng cảnh báo của riêng mình ('Xin chào'); cảnh báo ('thế giới'); // Nhận xét này theo tuyên bố

Nhận xét đa dòng bắt đầu bằng một dấu gạch chéo phía trước và dấu hoa thị / * và kết thúc bằng dấu hoa thị và một dấu gạch chéo phía trước * /. Như thế này:

/* Một ví dụ với hai tin nhắn. Đây là một nhận xét đa dòng. */ cảnh báo ('xin chào'); cảnh báo ('thế giới');

Nội dung của các bình luận bị bỏ qua, vì vậy nếu chúng ta đặt mã bên trong / * * * /, nó đã giành được thực thi. Đôi khi nó có thể tiện dụng để vô hiệu hóa tạm thời một phần của mã:

Mã xuất ra 6 vì JavaScript không chèn các dấu chấm phẩy ở đây. Rõ ràng là nếu dòng kết thúc bằng một điểm cộng "+", thì đó là một biểu thức không hoàn chỉnh của người Hồi giáo, do đó, dấu chấm phẩy không bắt buộc. Và trong trường hợp này hoạt động như dự định. Nhưng có những tình huống mà JavaScript đã thất bại khi giả sử một dấu chấm phẩy nơi nó thực sự cần thiết. Lỗi xảy ra trong các trường hợp như vậy khá khó tìm và sửa chữa.

Một ví dụ về một lỗi

Nếu bạn tò mò muốn thấy một ví dụ cụ thể về một lỗi như vậy, hãy kiểm tra mã này:

[1, 2] .foreach (cảnh báo)

Không cần phải suy nghĩ về ý nghĩa của dấu ngoặc [] và foreach chưa. Chúng tôi sẽ nghiên cứu chúng sau. Hiện tại, chỉ cần nhớ kết quả của mã: nó hiển thị 1 sau đó 2. Bây giờ, hãy để thêm một cảnh báo trước mã và không hoàn thành nó bằng dấu chấm phẩy: cảnh báo ("Sẽ có lỗi") [1, 2] .foreach (ALERT)

Bây giờ nếu chúng ta chạy mã, chỉ cảnh báo đầu tiên được hiển thị và sau đó chúng ta có lỗi! Nhưng mọi thứ lại ổn nếu chúng ta thêm một dấu chấm phẩy sau cảnh báo: cảnh báo ("Tất cả bây giờ tốt"); [1, 2] .foreach (cảnh báo)

Xin vui lòng, đừng ngần ngại bình luận mã của bạn. Nhận xét tăng dấu chân mã tổng thể, nhưng đó không phải là vấn đề gì cả. Có nhiều công cụ thu nhỏ mã trước khi xuất bản lên máy chủ sản xuất. Họ loại bỏ các bình luận, vì vậy họ không xuất hiện trong các kịch bản làm việc. Do đó, ý kiến ​​không có tác động tiêu cực đến sản xuất. Sau này trong hướng dẫn sẽ có một chất lượng mã chương cũng giải thích cách viết nhận xét tốt hơn.

Chế độ hiện đại, "Sử dụng nghiêm ngặt" trong một thời gian dài, JavaScript phát triển mà không có vấn đề tương thích. Các tính năng mới đã được thêm vào ngôn ngữ trong khi chức năng cũ không thay đổi. Điều đó có lợi ích là không bao giờ phá vỡ mã hiện có. Nhưng nhược điểm là bất kỳ sai lầm hoặc quyết định không hoàn hảo nào được đưa ra bởi những người sáng tạo JavaScript đã bị mắc kẹt trong ngôn ngữ mãi mãi. Đây là trường hợp cho đến năm 2009 khi Ecmascript 5 (ES5) xuất hiện. Nó đã thêm các tính năng mới vào ngôn ngữ và sửa đổi một số trong các tính năng hiện có. Để giữ cho mã cũ hoạt động, hầu hết các sửa đổi đều bị tắt theo mặc định. Bạn cần kích hoạt rõ ràng họ bằng một chỉ thị đặc biệt: "Sử dụng nghiêm ngặt".

Sử dụng nghiêm ngặt, chỉ thị trông giống như một chuỗi: "Sử dụng nghiêm ngặt" hoặc 'sử dụng nghiêm ngặt'. Khi nó nằm ở đầu một kịch bản, toàn bộ kịch bản hoạt động theo cách hiện đại của người Hồi giáo. Ví dụ:

"Sử dụng nghiêm ngặt"; // Mã này hoạt động theo cách hiện đại ...

Chúng tôi sẽ tìm hiểu các chức năng (một cách để các lệnh nhóm) sớm sớm. Nhìn về phía trước, hãy để Lôi chỉ lưu ý rằng "sử dụng nghiêm ngặt" có thể được đặt ở đầu hầu hết các loại chức năng thay vì toàn bộ kịch bản. Làm điều đó chỉ cho phép chế độ nghiêm ngặt trong chức năng đó. Nhưng thông thường, mọi người sử dụng nó cho toàn bộ kịch bản.

Đảm bảo rằng việc sử dụng nghiêm ngặt ”ở trên đỉnh

Vui lòng đảm bảo rằng "sử dụng nghiêm ngặt" ở đầu tập lệnh của bạn, nếu không chế độ nghiêm ngặt có thể không được bật. Chế độ nghiêm ngặt được kích hoạt ở đây:

cảnh báo ("một số mã"); // "Sử dụng nghiêm ngặt" bên dưới bị bỏ qua-nó phải ở trên cùng "sử dụng nghiêm ngặt"; // Chế độ nghiêm ngặt không được kích hoạt

Chỉ những bình luận có thể xuất hiện ở trên "Sử dụng nghiêm ngặt".

Đảm bảo rằng việc sử dụng nghiêm ngặt ”ở trên đỉnh

Vui lòng đảm bảo rằng "sử dụng nghiêm ngặt" ở đầu tập lệnh của bạn, nếu không chế độ nghiêm ngặt có thể không được bật. Chế độ nghiêm ngặt được kích hoạt ở đây:

cảnh báo ("một số mã"); // "Sử dụng nghiêm ngặt" bên dưới bị bỏ qua-nó phải ở trên cùng "sử dụng nghiêm ngặt"; // Chế độ nghiêm ngặt không được kích hoạt

Chỉ những bình luận có thể xuất hiện ở trên "Sử dụng nghiêm ngặt".

Không có cách nào để hủy sử dụng nghiêm ngặt

Không có chỉ thị như "không sử dụng nghiêm ngặt" mà đưa động cơ trở lại hành vi cũ. Khi chúng ta vào chế độ nghiêm ngặt, không có sự trở lại.

Bảng điều khiển trình duyệt cho tương lai, khi bạn sử dụng bảng điều khiển trình duyệt để kiểm tra các tính năng, xin lưu ý rằng nó không sử dụng nghiêm ngặt theo mặc định. Đôi khi, khi sử dụng nghiêm ngặt tạo ra sự khác biệt, bạn sẽ nhận được kết quả không chính xác. Bạn có thể cố gắng nhấn Shift+Enter vào đầu vào nhiều dòng và đặt sử dụng nghiêm ngặt trên đầu, như thế này:

'Sử dụng nghiêm ngặt'; // ...ma cua ban

Nó hoạt động trong hầu hết các trình duyệt, cụ thể là Firefox và Chrome. Nếu nó không có, cách đáng tin cậy nhất để đảm bảo sử dụng nghiêm ngặt sẽ là nhập mã vào bảng điều khiển như thế này:

(function () {'sử dụng nghiêm ngặt'; // ... mã của bạn ...}) ()

Luôn luôn sử dụng nghiêm ngặt ”

Chúng tôi vẫn chưa bao gồm sự khác biệt giữa chế độ nghiêm ngặt và chế độ mặc định trên mạng. Trong các chương tiếp theo, khi chúng tôi tìm hiểu các tính năng ngôn ngữ, chúng tôi sẽ lưu ý sự khác biệt giữa các chế độ nghiêm ngặt và mặc định. May mắn thay, có rất nhiều và họ thực sự làm cho cuộc sống của chúng ta tốt hơn. Hiện tại, nó đủ để biết về nó nói chung: 1. Chỉ thị "sử dụng nghiêm ngặt" chuyển động cơ sang chế độ hiện đại, thay đổi hành vi của một số tính năng tích hợp. Chúng tôi sẽ thấy các chi tiết sau này trong hướng dẫn. 2. Chế độ nghiêm ngặt được bật bằng cách đặt "Sử dụng nghiêm ngặt" ở đầu tập lệnh hoặc hàm. Một số tính năng ngôn ngữ, như các lớp học của các lớp và các mô -đun trực tuyến, và tự động bật chế độ nghiêm ngặt. 3. Chế độ nghiêm ngặt được hỗ trợ bởi tất cả các trình duyệt hiện đại. 4. Chúng tôi đề nghị luôn luôn bắt đầu các tập lệnh với "sử dụng nghiêm ngặt". Tất cả các ví dụ trong hướng dẫn này giả định chế độ nghiêm ngặt trừ khi (rất hiếm khi) được chỉ định khác.

Các biến hầu hết thời gian, một ứng dụng JavaScript cần làm việc với thông tin. Dưới đây là hai ví dụ: 1. Một cửa hàng trực tuyến - Thông tin có thể bao gồm hàng hóa được bán và giỏ hàng. 2. Một ứng dụng trò chuyện - Thông tin có thể bao gồm người dùng, tin nhắn và nhiều hơn nữa. Các biến được sử dụng để lưu trữ thông tin này.

Một biến Một biến là một bộ lưu trữ có tên là dữ liệu. Chúng tôi có thể sử dụng các biến để lưu trữ các tính năng, khách truy cập và dữ liệu khác. Để tạo một biến trong JavaScript, hãy sử dụng từ khóa LET. Câu lệnh bên dưới tạo ra (nói cách khác: khai báo hoặc xác định) một biến có tên là tin nhắn trực tuyến:

Hãy để tin nhắn;

Để súc tích, chúng ta có thể kết hợp khai báo và gán biến thành một dòng duy nhất:

hãy để tin nhắn = 'Xin chào!'; // Xác định biến và gán cảnh báo giá trị (tin nhắn); // Xin chào!

Chúng tôi cũng có thể khai báo nhiều biến trong một dòng:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Điều đó có vẻ ngắn hơn, nhưng chúng tôi không khuyến khích nó. Để có khả năng đọc tốt hơn, vui lòng sử dụng một dòng cho mỗi biến. Biến thể đa dòng dài hơn một chút, nhưng dễ đọc hơn:

Hãy để người dùng = 'John'; để tuổi = 25; hãy để tin nhắn = 'xin chào';

Một số người cũng xác định nhiều biến theo kiểu đa dòng này:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Điều đó có vẻ ngắn hơn, nhưng chúng tôi không khuyến khích nó. Để có khả năng đọc tốt hơn, vui lòng sử dụng một dòng cho mỗi biến. Biến thể đa dòng dài hơn một chút, nhưng dễ đọc hơn:

Hãy để người dùng = 'John'; để tuổi = 25; hãy để tin nhắn = 'xin chào';

Một số người cũng xác định nhiều biến theo kiểu đa dòng này:

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

Chúng ta có thể đặt bất kỳ giá trị nào vào hộp. Chúng tôi cũng có thể thay đổi nó bao nhiêu lần tùy thích:

Hãy để tin nhắn; tin nhắn = 'Xin chào!'; thông điệp = 'Thế giới!'; // giá trị thay đổi cảnh báo (tin nhắn);

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

Chúng ta có thể đặt bất kỳ giá trị nào vào hộp. Chúng tôi cũng có thể thay đổi nó bao nhiêu lần tùy thích:

Hãy để tin nhắn; tin nhắn = 'Xin chào!'; thông điệp = 'Thế giới!'; // giá trị thay đổi cảnh báo (tin nhắn);

Khi giá trị được thay đổi, dữ liệu cũ sẽ bị xóa khỏi biến:

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

// Lưu ý: Không "sử dụng nghiêm ngặt" trong ví dụ này num = 5; // biến "num" được tạo nếu nó không tồn tại cảnh báo (num); // 5

Đây là một thông lệ xấu và sẽ gây ra lỗi ở chế độ nghiêm ngặt:

"Sử dụng nghiêm ngặt"; num = 5; // Lỗi: Num không được xác định

Các hằng số để khai báo một biến hằng (không thay đổi), sử dụng const thay vì cho: const mybirthday = '18 .04.1982 ';

Các biến được tuyên bố bằng cách sử dụng const được gọi là hằng số. Họ không thể thay đổi. Một nỗ lực để làm như vậy sẽ gây ra lỗi:

const mybirthday = '18 .04.1982 '; mybirthday = '01 .01.2001 '; // Lỗi, không thể gán lại hằng số!

Khi một lập trình viên chắc chắn rằng một biến sẽ không bao giờ thay đổi, họ có thể khai báo nó với Const để đảm bảo và truyền đạt rõ ràng sự thật đó cho mọi người.

Hằng số từ trên Có một thực hành rộng rãi để sử dụng các hằng số làm bí danh cho các giá trị khó nhớ được biết trước khi thực hiện. Các hằng số như vậy được đặt tên bằng cách sử dụng chữ in hoa và dấu gạch dưới. Chẳng hạn, hãy để các hằng số cho các màu sắc trong cái gọi là định dạng Web Web (Hexadecimal):

const color_red = "#f00"; const color_green = "#0f0"; const color_blue = "#00f";

const color_orange = "#ff7f00"; // ... Khi chúng ta cần chọn một màu, hãy để màu = color_orange; cảnh báo (màu); // #ff7f00

Lợi ích: ●

Color_orange dễ nhớ hơn nhiều so với "#ff7f00".

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Khi đọc mã, color_orange có ý nghĩa hơn nhiều so với #ff7f00.

Khi nào chúng ta nên sử dụng thủ đô cho một hằng số và khi nào chúng ta nên đặt tên cho nó bình thường? Hãy để cho điều đó rõ ràng. Là một hằng số của người Viking, chỉ có nghĩa là giá trị của một biến không bao giờ thay đổi. Nhưng có những hằng số được biết trước khi thực hiện (như giá trị thập lục phân cho màu đỏ) và có các hằng số được tính theo thời gian chạy, trong quá trình thực hiện, nhưng không thay đổi sau khi gán ban đầu. Ví dụ:

const pageloadtime = / * Thời gian được thực hiện bởi một trang web để tải * /;

Giá trị của pageloadtime không được biết đến trước khi tải trang, do đó, nó có tên bình thường. Nhưng nó vẫn là một hằng số vì nó không thay đổi sau khi chuyển nhượng. Nói cách khác, các hằng số có tên vốn chỉ được sử dụng làm bí danh cho các giá trị mã hóa cứng.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Khi đọc mã, color_orange có ý nghĩa hơn nhiều so với #ff7f00.

Khi nào chúng ta nên sử dụng thủ đô cho một hằng số và khi nào chúng ta nên đặt tên cho nó bình thường? Hãy để cho điều đó rõ ràng. Là một hằng số của người Viking, chỉ có nghĩa là giá trị của một biến không bao giờ thay đổi. Nhưng có những hằng số được biết trước khi thực hiện (như giá trị thập lục phân cho màu đỏ) và có các hằng số được tính theo thời gian chạy, trong quá trình thực hiện, nhưng không thay đổi sau khi gán ban đầu. Ví dụ:

const pageloadtime = / * Thời gian được thực hiện bởi một trang web để tải * /;

Giá trị của pageloadtime không được biết đến trước khi tải trang, do đó, nó có tên bình thường. Nhưng nó vẫn là một hằng số vì nó không thay đổi sau khi chuyển nhượng. Nói cách khác, các hằng số có tên vốn chỉ được sử dụng làm bí danh cho các giá trị mã hóa cứng.

Kể tên những điều đúng đắn nói về các biến, có một điều cực kỳ quan trọng hơn. Một tên biến cần có một ý nghĩa rõ ràng, rõ ràng, mô tả dữ liệu mà nó lưu trữ. Đặt tên biến là một trong những kỹ năng quan trọng và phức tạp nhất trong lập trình. Một cái nhìn nhanh vào các tên biến có thể tiết lộ mã nào được viết bởi người mới bắt đầu so với một nhà phát triển có kinh nghiệm. Trong một dự án thực sự, hầu hết thời gian được dành để sửa đổi và mở rộng một cơ sở mã hiện có thay vì viết một cái gì đó hoàn toàn tách biệt với đầu. Khi chúng tôi trở lại một số mã sau khi làm một việc khác trong một thời gian, nó sẽ dễ dàng hơn nhiều để tìm thấy thông tin được dán nhãn tốt. Hoặc, nói cách khác, khi các biến có tên tốt. Vui lòng dành thời gian suy nghĩ về tên phù hợp cho một biến trước khi khai báo nó. Làm như vậy sẽ trả nợ cho bạn một cách đẹp đẽ. Một số quy tắc tốt theo dõi là: ●

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Các biến nên được đặt tên theo cách cho phép chúng ta dễ dàng hiểu được những gì bên trong chúng.

Nhiệm vụ làm việc với các biến quan trọng: 2 1. Khai báo hai biến: quản trị viên và tên. 2. Gán giá trị "John" cho tên. 3. Sao chép giá trị từ tên này sang quản trị viên. 4. Hiển thị giá trị của quản trị viên bằng cách sử dụng cảnh báo (phải xuất ra John John).

Để giải pháp

Cho đúng tên tầm quan trọng: 3 1. Tạo một biến với tên của hành tinh của chúng ta. Làm thế nào bạn sẽ đặt tên cho một biến như vậy? 2. Tạo một biến để lưu trữ tên của một khách truy cập hiện tại vào một trang web. Làm thế nào bạn sẽ đặt tên cho biến đó? Để giải pháp

Constercase const? Tầm quan trọng: 4 Kiểm tra mã sau: const sinh nhật = '18 .04.1982 '; const tuổi = somecode (sinh nhật);

Ở đây chúng tôi có một ngày sinh nhật liên tục và tuổi được tính từ sinh nhật với sự trợ giúp của một số mã (nó không được cung cấp cho thời gian ngắn và vì chi tiết không quan trọng ở đây). Sẽ đúng khi sử dụng trường hợp trên cho sinh nhật? Cho tuổi? Hoặc thậm chí cho cả hai? sinh nhật const = '18 .04.1982 '; // Làm từ dưới? const tuổi = somecode (sinh nhật); // Làm từ dưới?

Để giải pháp

Cho đúng tên tầm quan trọng: 3 1. Tạo một biến với tên của hành tinh của chúng ta. Làm thế nào bạn sẽ đặt tên cho một biến như vậy? 2. Tạo một biến để lưu trữ tên của một khách truy cập hiện tại vào một trang web. Làm thế nào bạn sẽ đặt tên cho biến đó? Để giải pháp

Constercase const? Tầm quan trọng: 4 Kiểm tra mã sau: const sinh nhật = '18 .04.1982 '; const tuổi = somecode (sinh nhật);

Ở đây chúng tôi có một ngày sinh nhật liên tục và tuổi được tính từ sinh nhật với sự trợ giúp của một số mã (nó không được cung cấp cho thời gian ngắn và vì chi tiết không quan trọng ở đây). Sẽ đúng khi sử dụng trường hợp trên cho sinh nhật? Cho tuổi? Hoặc thậm chí cho cả hai? sinh nhật const = '18 .04.1982 '; // Làm từ dưới? const tuổi = somecode (sinh nhật); // Làm từ dưới?

Kiểu dữ liệu Một biến trong JavaScript có thể chứa bất kỳ dữ liệu nào. Một biến có thể tại một thời điểm là một chuỗi và tại một số khác là một số:

// không có lỗi, hãy để tin nhắn = "xin chào"; tin nhắn = 123456;

Các ngôn ngữ lập trình cho phép những thứ như vậy được gọi là gõ một cách tự động, có nghĩa là có các loại dữ liệu, nhưng các biến không bị ràng buộc với bất kỳ loại nào trong số chúng. Có bảy loại dữ liệu cơ bản trong JavaScript. Ở đây, chúng tôi sẽ bao gồm chúng nói chung và trong các chương tiếp theo, chúng tôi sẽ nói về từng người trong số họ một cách chi tiết.

Một số hãy n = 123; n = 12.345;

Loại số đại diện cho cả số số nguyên và số nổi. Có nhiều hoạt động cho các số, ví dụ: phép nhân *, chia /, bổ sung +, phép trừ -, v.v. Bên cạnh các số thông thường, còn có những giá trị số đặc biệt được gọi là, cũng thuộc loại dữ liệu này: vô cực, -Infinity và Nan. ●

Infinity đại diện cho vô cùng toán học bất kỳ số nào.

. Đó là một giá trị đặc biệt mà lớn hơn

Chúng ta có thể nhận được nó như là kết quả của sự phân chia theo 0:

cảnh báo (1/0); // Vô cực

Hoặc chỉ tham khảo trực tiếp nó:

cảnh báo (vô cực); // Vô cực

NAN đại diện cho một lỗi tính toán. Nó là kết quả của một hoạt động toán học không chính xác hoặc không xác định, ví dụ:

cảnh báo ("không phải là số" / 2); // nan, sự phân chia như vậy là sai lầm

Nan là dính. Bất kỳ hoạt động nào nữa trên NAN trả về NAN: cảnh báo ("không phải là số" / 2 + 5); // nan

Vì vậy, nếu có một nan ở đâu đó trong một biểu thức toán học, nó sẽ tuyên truyền đến toàn bộ kết quả.

Hoạt động toán học an toàn

Làm toán là một người an toàn trong JavaScript. Chúng ta có thể làm bất cứ điều gì: chia cho 0, coi các chuỗi không phải là số là số, v.v ... Kịch bản sẽ không bao giờ dừng lại với một lỗi nghiêm trọng (Hồi Die). Tệ nhất, chúng tôi sẽ nhận được NAN như là kết quả. Các giá trị số đặc biệt chính thức thuộc về loại số trực tuyến. Tất nhiên chúng không phải là những con số theo nghĩa chung của từ này.

Chúng tôi sẽ thấy nhiều hơn về việc làm việc với các số trong các số chương.

Một chuỗi Một chuỗi trong JavaScript phải được bao quanh bởi các trích dẫn.

Đặt str = "xin chào"; Đặt str2 = 'trích dẫn đơn cũng vậy'; Đặt cụm từ = `có thể nhúng $ {str}`;

Trong JavaScript, có 3 loại trích dẫn. 1. Double Trích dẫn: "Xin chào". 2. Trích dẫn đơn: 'Xin chào'. 3. Backticks: `Xin chào`. Trích dẫn kép và đơn là trích dẫn đơn giản của người Viking. Không có sự khác biệt giữa họ trong JavaScript. Backticks là các trích dẫn chức năng mở rộng của người Viking. Chúng cho phép chúng tôi nhúng các biến và biểu thức vào một chuỗi bằng cách gói chúng trong $ {,}, ví dụ: hãy để name = "john"; // nhúng một cảnh báo biến (`Xin chào, $ {name}!`); // Chào John! // nhúng cảnh báo biểu thức (`Kết quả là $ {1 + 2}}); // kết quả là 3

cảnh báo ("không phải là số" / 2); // nan, sự phân chia như vậy là sai lầm

Nan là dính. Bất kỳ hoạt động nào nữa trên NAN trả về NAN: cảnh báo ("không phải là số" / 2 + 5); // nan

Vì vậy, nếu có một nan ở đâu đó trong một biểu thức toán học, nó sẽ tuyên truyền đến toàn bộ kết quả.

hãy để nameFieldChecked = true; // Có, trường tên được kiểm tra cho AgeFieldChecked = false; // Không, trường tuổi không được kiểm tra

Các giá trị Boolean cũng là kết quả của sự so sánh:

Let Isgreater = 4> 1; cảnh báo (Isgreater); // true (kết quả so sánh là "có")

Chúng tôi sẽ bao gồm Booleans sâu hơn trong các toán tử logic chương.

Giá trị của NULL giá trị giá trị null đặc biệt không thuộc về bất kỳ loại nào được mô tả ở trên. Nó tạo thành một loại riêng biệt của riêng nó chỉ chứa giá trị null: Let Age = null;

Trong JavaScript, NULL không phải là một tài liệu tham khảo về một đối tượng không tồn tại, hay một con trỏ Null Null giống như trong một số ngôn ngữ khác. Nó chỉ là một giá trị đặc biệt đại diện cho không có gì, không có giá trị nào. Mã trên nói rằng tuổi không rõ hoặc trống vì một số lý do.

Giá trị không xác định của người Viking Giá trị đặc biệt không được xác định cũng đứng cách nhau. Nó làm cho một loại của riêng mình, giống như null. Ý nghĩa của không xác định là giá trị không được gán. Nếu một biến được khai báo, nhưng không được gán, thì giá trị của nó không được xác định: Đặt x; cảnh báo (x); // cho thấy "không xác định"

Về mặt kỹ thuật, có thể gán không xác định cho bất kỳ biến nào:

Đặt x = 123; x = không xác định; cảnh báo (x); // "chưa xác định"

Nhưng chúng tôi không khuyên bạn nên làm điều đó. Thông thường, chúng tôi sử dụng NULL để gán một giá trị trống rỗng hoặc không xác định được cho một biến và chúng tôi sử dụng không xác định để kiểm tra như xem liệu một biến có được chỉ định không.

Đối tượng và ký hiệu Loại đối tượng là đặc biệt. Tất cả các loại khác được gọi là nguyên thủy, vì các giá trị của chúng chỉ có thể chứa một thứ duy nhất (có thể là một chuỗi hoặc một số hoặc bất cứ điều gì). Ngược lại, các đối tượng được sử dụng để lưu trữ các bộ sưu tập dữ liệu và các thực thể phức tạp hơn. Chúng tôi sẽ đối phó với chúng sau này trong các đối tượng chương sau khi chúng tôi tìm hiểu thêm về các nguyên thủy. Loại ký hiệu được sử dụng để tạo số nhận dạng duy nhất cho các đối tượng. Chúng tôi phải đề cập đến nó ở đây để hoàn thiện, nhưng nó tốt hơn để nghiên cứu loại này sau các đối tượng.

Toán tử typeOf Trình vận hành typeOf trả về loại đối số. Nó rất hữu ích khi chúng tôi muốn xử lý các giá trị của các loại khác nhau khác nhau hoặc chỉ muốn kiểm tra nhanh. Nó hỗ trợ hai dạng cú pháp: 1. Là người vận hành: typeof x. 2. Là một hàm: Loại (x). Nói cách khác, nó hoạt động với dấu ngoặc đơn hoặc không có chúng. Kết quả là như nhau. Call to typeof X trả về một chuỗi với tên loại: typeof Undefined // "loại" loại "không xác định 0 //" số "typeof true //" boolean "typeof" foo "//" chuỗi "biểu tượng loại // "Biểu tượng" Toán loại // "Đối tượng"

(1)

typeof null // "Đối tượng"

(2)

TypeOf Alert // "Chức năng"

(3)

Ba dòng cuối cùng có thể cần giải thích bổ sung: 1. Toán học là một đối tượng tích hợp cung cấp các hoạt động toán học. Chúng tôi sẽ học nó trong các số chương. Ở đây, nó chỉ phục vụ như một ví dụ về một đối tượng. 2. Kết quả của typeof null là "đối tượng". Sai rồi. Đó là một lỗi chính thức được công nhận trong typeof, được giữ để tương thích. Tất nhiên, NULL không phải là một đối tượng. Nó là một giá trị đặc biệt với một loại riêng của riêng nó. Vì vậy, một lần nữa, đây là một lỗi trong ngôn ngữ. 3. Kết quả của cảnh báo loại là "hàm", vì cảnh báo là một hàm. Chúng tôi sẽ nghiên cứu các chức năng trong các chương tiếp theo, nơi chúng tôi cũng sẽ thấy rằng không có loại chức năng đặc biệt nào trong JavaScript. Các chức năng thuộc loại đối tượng. Nhưng typeof đối xử với họ khác nhau, trả lại "chức năng". Điều đó không hoàn toàn chính xác, nhưng rất thuận tiện trong thực tế.

Tóm tắt Có 7 loại dữ liệu cơ bản trong JavaScript. ●

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Boolean cho Đúng / Sai.

null cho các giá trị không xác định - một loại độc lập có một giá trị duy nhất null.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Boolean cho Đúng / Sai.

null cho các giá trị không xác định - một loại độc lập có một giá trị duy nhất null.

Không xác định cho các giá trị không được chỉ định - một loại độc lập có một giá trị duy nhất không được xác định.

Đối tượng cho các cấu trúc dữ liệu phức tạp hơn.

Biểu tượng cho số nhận dạng duy nhất.

Chưa nói về các đối tượng

Trong chương này, chúng tôi đã giành được các đối tượng che phủ. Thay vào đó, chúng tôi sẽ nghiên cứu nguyên thủy trước. Sau đó, sau khi chúng tôi tìm hiểu về các đối tượng, chúng tôi sẽ thấy cách chuyển đổi đối tượng hoạt động trong đối tượng chương sang chuyển đổi nguyên thủy.

Chuyển đổi chuỗi toString xảy ra khi chúng ta cần dạng chuỗi của một giá trị. Ví dụ, cảnh báo (giá trị) thực hiện nó để hiển thị giá trị. Chúng ta cũng có thể gọi hàm chuỗi (giá trị) để chuyển đổi giá trị thành chuỗi: LET value = true; cảnh báo (giá trị loại); // boolean value = chuỗi (giá trị); // Bây giờ giá trị là một chuỗi cảnh báo "true" (giá trị typeOf); // sợi dây

Chuyển đổi chuỗi chủ yếu là rõ ràng. A Sai trở thành "sai", null trở thành "null", v.v.

Chuyển đổi số tonumber xảy ra trong các hàm và biểu thức toán học tự động. Ví dụ: khi phân chia / được áp dụng cho những người không phải là người: cảnh báo ("6" / "2"); // 3, chuỗi được chuyển đổi thành số

Chúng ta có thể sử dụng hàm số (giá trị) để chuyển đổi một cách rõ ràng một giá trị thành một số:

Đặt str = "123"; cảnh báo (typeof str); // chuỗi let num = number (str); // trở thành một cảnh báo số 123 (typeOf num); // con số

Chuyển đổi rõ ràng thường được yêu cầu khi chúng tôi đọc một giá trị từ một nguồn dựa trên chuỗi như một biểu mẫu văn bản nhưng mong đợi một số sẽ được nhập. Nếu chuỗi không phải là một số hợp lệ, kết quả của việc chuyển đổi như vậy là NAN. Ví dụ: Let Age = Number ("một chuỗi tùy ý thay vì số"); cảnh báo (tuổi); // nan, chuyển đổi không thành công

Quy tắc chuyển đổi số: Giá trị

Trở thành…

chưa xác định

Nan

vô giá trị

0

đúng và sai

1 và 0 khoảng trắng từ đầu và kết thúc được loại bỏ. Nếu chuỗi còn lại trống, kết quả là 0.

sợi dây

Mặt khác, số là người đọc đọc từ chuỗi. Một lỗi cho NAN.

Ví dụ:

cảnh báo (cảnh báo (cảnh báo (cảnh báo (

Số ("123")); // 123 số ("123z")); // nan (lỗi đọc một số tại số "z") (true)); // 1 số (sai)); // 0

Xin lưu ý rằng NULL và không xác định hoạt động khác nhau ở đây: null trở thành 0 trong khi không xác định trở thành NAN.

Bổ sung ’+chuỗi Concatenates chuỗi

Hầu như tất cả các hoạt động toán học chuyển đổi giá trị thành số. Một ngoại lệ đáng chú ý là bổ sung +. Nếu một trong các giá trị được thêm vào là một chuỗi, một giá trị còn lại cũng được chuyển đổi thành một chuỗi. Sau đó, nó kết hợp (tham gia) chúng:

cảnh báo (1 + '2'); // '12' (chuỗi bên phải) cảnh báo ('1' + 2); // '12' (chuỗi bên trái)

Điều này chỉ xảy ra khi ít nhất một trong các đối số là một chuỗi. Nếu không, các giá trị được chuyển đổi thành số.

Chuyển đổi Boolean của Toboolean là đơn giản nhất. Nó xảy ra trong các hoạt động logic (sau đó chúng tôi sẽ đáp ứng các thử nghiệm điều kiện và những điều tương tự khác) nhưng cũng có thể được thực hiện rõ ràng với một cuộc gọi để Boolean (giá trị). Quy tắc chuyển đổi: ●

Các giá trị có trực giác trống rỗng, như 0, một chuỗi trống, null, không xác định và nan, trở nên sai. Các giá trị khác trở thành đúng.

Ví dụ:

cảnh báo (boolean (1)); // cảnh báo thực (boolean (0)); // cảnh báo sai (boolean ("xin chào")); // cảnh báo thực sự (boolean ("")); // sai

Xin lưu ý: Chuỗi bằng không "0" là đúng

Một số ngôn ngữ (cụ thể là PHP) coi "0" là sai. Nhưng trong JavaScript, một chuỗi không trống luôn luôn đúng. cảnh báo (boolean ("0")); // cảnh báo thực sự (boolean ("")); // không gian, cũng đúng (bất kỳ chuỗi không trống nào là đúng)

Tóm tắt Ba chuyển đổi loại được sử dụng rộng rãi nhất là chuỗi, thành số và boolean.

ToString - xảy ra khi chúng ta xuất ra một cái gì đó. Có thể được thực hiện với chuỗi (giá trị). Việc chuyển đổi thành chuỗi thường rõ ràng cho các giá trị nguyên thủy. Tonumber - xảy ra trong các hoạt động toán học. Có thể được thực hiện với số (giá trị). Chuyển đổi tuân theo các quy tắc: giá trị

Trở thành…

chưa xác định

Nan

vô giá trị

0

đúng và sai

1 và 0 khoảng trắng từ đầu và kết thúc được loại bỏ. Nếu chuỗi còn lại trống, kết quả là 0.

sợi dây

Mặt khác, số là người đọc đọc từ chuỗi. Một lỗi cho NAN.

Ví dụ:

cảnh báo (cảnh báo (cảnh báo (cảnh báo (

Số ("123")); // 123 số ("123z")); // nan (lỗi đọc một số tại số "z") (true)); // 1 số (sai)); // 0

Xin lưu ý rằng NULL và không xác định hoạt động khác nhau ở đây: null trở thành 0 trong khi không xác định trở thành NAN.

Các giá trị có trực giác trống rỗng, như 0, một chuỗi trống, null, không xác định và nan, trở nên sai. Các giá trị khác trở thành đúng.

Ví dụ:

cảnh báo (boolean (1)); // cảnh báo thực (boolean (0)); // cảnh báo sai (boolean ("xin chào")); // cảnh báo thực sự (boolean ("")); // sai

Hãy suy nghĩ tốt, viết ra và sau đó so sánh với câu trả lời. Để giải pháp

Các nhà khai thác Chúng tôi biết nhiều nhà khai thác từ trường học. Chúng là những thứ như bổ sung +, nhân *, phép trừ -, v.v. Trong chương này, chúng tôi sẽ tập trung vào các khía cạnh của các nhà khai thác không được bao phủ bởi số học của trường.

Các điều khoản: Một số người không phải là người khác, một số người khác, một số người, một số người khác, trước khi chúng ta tiếp tục, hãy để nắm bắt một số thuật ngữ phổ biến. ●

Một toán hạng - là những gì các nhà khai thác được áp dụng. Chẳng hạn, trong phép nhân 5 * 2 có hai toán hạng: toán hạng bên trái là 5 và toán hạng bên phải là 2. Đôi khi, mọi người gọi những đối số này là những người khác, thay vì các vở opera của người Viking. Một nhà điều hành là đơn giản nếu nó có một toán hạng duy nhất. Ví dụ: sự phủ định đơn giản - đảo ngược dấu hiệu của một số:

Đặt x = 1; x = -x; cảnh báo (x); // -1, sự phủ định chưa được áp dụng

Một toán hạng - là những gì các nhà khai thác được áp dụng. Chẳng hạn, trong phép nhân 5 * 2 có hai toán hạng: toán hạng bên trái là 5 và toán hạng bên phải là 2. Đôi khi, mọi người gọi những đối số này là những người khác, thay vì các vở opera của người Viking. Một nhà điều hành là đơn giản nếu nó có một toán hạng duy nhất. Ví dụ: sự phủ định đơn giản - đảo ngược dấu hiệu của một số:

Đặt x = 1; x = -x; cảnh báo (x); // -1, sự phủ định chưa được áp dụng

Một nhà điều hành là nhị phân nếu nó có hai toán hạng. Cùng một điểm trừ cũng tồn tại ở dạng nhị phân:

Đặt x = 1, y = 3; cảnh báo (y - x); // 2, nhị phân trừ các giá trị

Chính thức, chúng tôi nói về hai toán tử khác nhau ở đây: sự phủ định không (toán hạng đơn: đảo ngược dấu hiệu) và phép trừ nhị phân (hai toán hạng: trừ).

Kết hợp chuỗi, nhị phân + bây giờ, hãy để xem các tính năng đặc biệt của các toán tử JavaScript vượt ra ngoài trường học. Thông thường, toán tử cộng + số tổng. Nhưng, nếu nhị phân + được áp dụng cho các chuỗi, nó sẽ hợp nhất (concatenates) chúng:

Đặt S = "của tôi" + "chuỗi"; cảnh báo (s); // MyString

Lưu ý rằng nếu một trong các toán hạng là một chuỗi, chuỗi còn lại cũng được chuyển đổi thành một chuỗi. Ví dụ:

cảnh báo ('1' + 2); // "12" cảnh báo (2 + '1'); // "21"

Hãy xem, nó không quan trọng cho dù toán hạng đầu tiên là một chuỗi hay là chuỗi thứ hai. Quy tắc rất đơn giản: nếu một trong hai toán hạng là một chuỗi, một loại còn lại cũng được chuyển đổi thành một chuỗi. Tuy nhiên, lưu ý rằng các hoạt động chạy từ trái sang phải. Nếu có hai số theo sau là một chuỗi, các số sẽ được thêm vào trước khi được chuyển đổi thành một chuỗi:

cảnh báo (2 + 2 + '1'); // "41" chứ không phải "221"

Kết hợp và chuyển đổi chuỗi là một tính năng đặc biệt của nhị phân cộng với +. Các toán tử số học khác chỉ làm việc với các số và luôn chuyển đổi toán hạng của chúng thành các số. Ví dụ, phép trừ và phân chia:

cảnh báo (2 - '1'); // 1 cảnh báo ('6' / '2'); // 3

Chuyển đổi số, unary + plus + tồn tại ở hai dạng: dạng nhị phân mà chúng tôi đã sử dụng ở trên và dạng đơn. Nói cách khác, UNARY Plus hoặc, nói cách khác, toán tử cộng + áp dụng cho một giá trị duy nhất, không làm bất cứ điều gì với số. Nhưng nếu toán hạng không phải là một số, Unary Plus sẽ chuyển đổi nó thành một số. Ví dụ:

// Không ảnh hưởng đến các số Đặt x = 1; cảnh báo ( +x); // 1 Đặt y = -2; cảnh báo ( +y); // -2 // Chuyển đổi cảnh báo không phải số người ( +true); // 1 cảnh báo ( +""); // 0

Nó thực sự làm điều tương tự như số (...), nhưng ngắn hơn.

Sự cần thiết phải chuyển đổi chuỗi thành số phát sinh rất thường xuyên. Ví dụ: nếu chúng ta nhận được các giá trị từ các trường HTML, chúng thường là chuỗi. Điều gì sẽ xảy ra nếu chúng ta muốn tổng hợp chúng? Nhị phân Plus sẽ thêm chúng làm chuỗi:

Đặt táo = "2"; Đặt cam = "3"; cảnh báo (táo + cam); // "23", chuỗi cộng với chuỗi

Nếu chúng ta muốn coi chúng là số, chúng ta cần chuyển đổi và sau đó tổng hợp chúng:

Đặt táo = "2"; Đặt cam = "3"; // cả hai giá trị được chuyển đổi thành số trước cảnh báo nhị phân cộng với ( +táo + +cam); // 5 // biến thể dài hơn // cảnh báo (số (táo) + số (cam)); // 5

Tên

Dấu hiệu

Quyền ưu tiên

Tên

Dấu hiệu

16

Quyền ưu tiên

16

Unary Plus

+

14

không phủ định

-

14

phép nhân

*

13

phân công

Quyền ưu tiên

13

Unary Plus

+

3

Quyền ưu tiên

Quyền ưu tiên

Unary Plus

+

không phủ định

-

phép nhân

*

phân công

/

phép cộng

phép trừ

phân công

… =…

Như chúng ta có thể thấy, người khác không có mức độ ưu tiên là 16, cao hơn 13 của bổ sung khác (nhị phân Plus). Đó là lý do tại sao, trong biểu thức " +táo + +cam", UNARY Pluses hoạt động trước khi bổ sung.

Bài tập Hãy lưu ý rằng một bài tập = cũng là một toán tử. Nó được liệt kê trong bảng ưu tiên với mức độ ưu tiên rất thấp là 3. Đó là lý do tại sao, khi chúng ta gán một biến, như x = 2 * 2 + 1, các tính toán được thực hiện trước và sau đó = được đánh giá, lưu trữ kết quả trong x. Đặt x = 2 * 2 + 1; cảnh báo (x); // 5

Có thể chuỗi bài tập:

Đặt A, B, C; a = b = c = 2 + 2; cảnh báo (a); // 4 cảnh báo (b); // 4 cảnh báo (c); // 4

Bài tập xích đánh giá từ phải sang trái. Đầu tiên, biểu thức ngoài cùng bên phải 2 + 2 được đánh giá và sau đó được gán cho các biến ở bên trái: c, b và a. Cuối cùng, tất cả các biến chia sẻ một giá trị duy nhất.

Toán tử gán "=" trả về giá trị

Một toán tử luôn trả về một giá trị. Điều đó rõ ràng đối với hầu hết trong số họ như bổ sung + hoặc nhân *. Nhưng toán tử chuyển nhượng tuân theo quy tắc này quá. Cuộc gọi x = value ghi giá trị thành x và sau đó trả về nó. Ở đây, một bản demo sử dụng một bài tập như một phần của biểu thức phức tạp hơn:

Đặt A = 1; Đặt b = 2; Đặt c = 3 - (a = b + 1); cảnh báo (a); // 3 cảnh báo (c); // 0

Trong ví dụ trên, kết quả của biểu thức (A = B + 1) là giá trị được gán cho A (đó là 3). Sau đó nó được sử dụng để đánh giá thêm. Mã vui nhộn, có phải là nó không? Chúng ta nên hiểu cách thức hoạt động của nó, bởi vì đôi khi chúng ta thấy nó trong các thư viện JavaScript, nhưng không nên viết bất cứ thứ gì giống như vậy. Những mánh khóe như vậy chắc chắn don don làm cho mã rõ ràng hơn hoặc có thể đọc được.

Phần còn lại % nhà điều hành còn lại %, mặc dù sự xuất hiện của nó, không liên quan đến phần trăm. Kết quả của một % B là phần còn lại của sự phân chia số nguyên của a bởi b. Ví dụ:

cảnh báo (5 % 2); // 1 là phần còn lại của 5 chia cho 2 cảnh báo (8 % 3); // 2 là phần còn lại của 8 chia cho 3 cảnh báo (6 % 3); // 0 là phần còn lại của 6 chia cho 3

Chứng số mũ ** Toán tử số mũ ** là một bổ sung gần đây cho ngôn ngữ. Đối với số B tự nhiên, kết quả của A ** B là nhân với chính nó b. Ví dụ:

Một toán tử luôn trả về một giá trị. Điều đó rõ ràng đối với hầu hết trong số họ như bổ sung + hoặc nhân *. Nhưng toán tử chuyển nhượng tuân theo quy tắc này quá. Cuộc gọi x = value ghi giá trị thành x và sau đó trả về nó. Ở đây, một bản demo sử dụng một bài tập như một phần của biểu thức phức tạp hơn:

Đặt A = 1; Đặt b = 2; Đặt c = 3 - (a = b + 1); cảnh báo (a); // 3 cảnh báo (c); // 0

Trong ví dụ trên, kết quả của biểu thức (A = B + 1) là giá trị được gán cho A (đó là 3). Sau đó nó được sử dụng để đánh giá thêm. Mã vui nhộn, có phải là nó không? Chúng ta nên hiểu cách thức hoạt động của nó, bởi vì đôi khi chúng ta thấy nó trong các thư viện JavaScript, nhưng không nên viết bất cứ thứ gì giống như vậy. Những mánh khóe như vậy chắc chắn don don làm cho mã rõ ràng hơn hoặc có thể đọc được.

Phần còn lại % nhà điều hành còn lại %, mặc dù sự xuất hiện của nó, không liên quan đến phần trăm. Kết quả của một % B là phần còn lại của sự phân chia số nguyên của a bởi b. Ví dụ:

cảnh báo (5 % 2); // 1 là phần còn lại của 5 chia cho 2 cảnh báo (8 % 3); // 2 là phần còn lại của 8 chia cho 3 cảnh báo (6 % 3); // 0 là phần còn lại của 6 chia cho 3

Chứng số mũ ** Toán tử số mũ ** là một bổ sung gần đây cho ngôn ngữ. Đối với số B tự nhiên, kết quả của A ** B là nhân với chính nó b. Ví dụ:

cảnh báo (2 ** 2); // 4 (2 * 2) cảnh báo (2 ** 3); // 8 (2 * 2 * 2) cảnh báo (2 ** 4); // 16 (2 * 2 * 2 * 2)

Nhà điều hành cũng hoạt động cho các số không số nguyên là tốt.

Ví dụ:

Nếu chúng tôi muốn tăng giá trị và sử dụng ngay kết quả của người vận hành, chúng tôi cần biểu mẫu tiền tố:

Đặt bộ đếm = 0; cảnh báo (bộ đếm ++); // 1

Nếu chúng tôi muốn tăng giá trị nhưng sử dụng giá trị trước đó, chúng tôi cần biểu mẫu Postfix:

Đặt bộ đếm = 0; cảnh báo (bộ đếm ++); // 0

Tăng/giảm trong số các nhà khai thác khác

Các toán tử ++/- cũng có thể được sử dụng bên trong các biểu thức. Ưu tiên của họ cao hơn hầu hết các hoạt động số học khác. Ví dụ:

Đặt Counter = 1; cảnh báo (bộ đếm 2 * ++); // 4

So sánh với:

Đặt Counter = 1; cảnh báo (2 * bộ đếm ++); // 2, vì bộ đếm ++ trả về giá trị "cũ"

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo (2 * bộ đếm); Bộ đếm ++;

Các nhà khai thác bitwise bitwise, các nhà khai thác coi các đối số là số nguyên 32 bit và hoạt động ở cấp độ biểu diễn nhị phân của chúng. Các nhà khai thác này không dành riêng cho JavaScript. Chúng được hỗ trợ trong hầu hết các ngôn ngữ lập trình. Danh sách các nhà khai thác: ●

VÀ ( & )

Hoặc (|)

Xor ( ^)

Không (~)

SHIF trái (>)

Không điền đúng ca (>>>)

Những người vận hành này được sử dụng rất hiếm khi. Để hiểu họ, chúng ta cần đi sâu vào đại diện số cấp thấp và sẽ không tối ưu để làm điều đó ngay bây giờ, đặc biệt là vì chúng ta

Thắng được cần họ bất cứ lúc nào sớm. Nếu bạn tò mò, bạn có thể đọc các toán tử bitwise trên MDN. Nó sẽ là thực tế hơn để làm điều đó khi một nhu cầu thực sự phát sinh.

bài báo

Sửa đổi tại chỗ, chúng ta thường cần áp dụng toán tử vào một biến và lưu trữ kết quả mới trong cùng một biến đó. Ví dụ:

Đặt n = 2; n = n + 5; n = n * 2;

Ký hiệu này có thể được rút ngắn bằng các toán tử += và *=: Đặt n = 2; n += 5; // bây giờ n = 7 (giống như n = n + 5) n *= 2; // bây giờ n = 14 (giống như n = n * 2) cảnh báo (n); // 14

Các toán tử sửa đổi và phân loại ngắn hạn tồn tại cho tất cả các toán tử arithmetical và bitwise: /=,-=, v.v.

Đặt n = 2; n *= 3 + 5; cảnh báo (n); // 16

(phần bên phải được đánh giá đầu tiên, giống như n *= 8)

Dấu phẩy Người vận hành dấu phẩy, là một trong những nhà khai thác hiếm nhất và bất thường nhất. Đôi khi, nó được sử dụng để viết mã ngắn hơn, vì vậy chúng ta cần biết nó để hiểu những gì đang diễn ra. Nhà điều hành dấu phẩy cho phép chúng tôi đánh giá một số biểu thức, chia chúng với dấu phẩy,. Mỗi người trong số họ được đánh giá nhưng chỉ có kết quả của cái cuối cùng được trả lại. Ví dụ:

Đặt A = (1 + 2, 3 + 4); cảnh báo (a); // 7 (kết quả của 3 + 4)

Ở đây, biểu thức đầu tiên 1 + 2 được đánh giá và kết quả của nó được vứt bỏ. Sau đó, 3 + 4 được đánh giá và trả lại là kết quả.

Tăng/giảm trong số các nhà khai thác khác

Các toán tử ++/- cũng có thể được sử dụng bên trong các biểu thức. Ưu tiên của họ cao hơn hầu hết các hoạt động số học khác. Ví dụ:

Đặt Counter = 1; cảnh báo (bộ đếm 2 * ++); // 4

So sánh với:

Đặt Counter = 1; cảnh báo (2 * bộ đếm ++); // 2, vì bộ đếm ++ trả về giá trị "cũ"

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo (2 * bộ đếm); Bộ đếm ++;

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo (2 * bộ đếm); Bộ đếm ++;

Các nhà khai thác bitwise bitwise, các nhà khai thác coi các đối số là số nguyên 32 bit và hoạt động ở cấp độ biểu diễn nhị phân của chúng. Các nhà khai thác này không dành riêng cho JavaScript. Chúng được hỗ trợ trong hầu hết các ngôn ngữ lập trình. Danh sách các nhà khai thác: ●

VÀ ( & )

Hoặc (|)

Xor ( ^)

Không (~)

cảnh báo ('z'> 'a'); // cảnh báo đúng ('phát sáng'> 'glee'); // cảnh báo đúng ('ong'> 'be'); // thật

Thuật toán để so sánh hai chuỗi rất đơn giản:

1. So sánh ký tự đầu tiên của cả hai chuỗi. 2. Nếu ký tự đầu tiên từ chuỗi đầu tiên lớn hơn (hoặc ít hơn) so với chuỗi khác, thì chuỗi đầu tiên lớn hơn (hoặc ít hơn) so với thứ hai. Đã được thực hiện. 3. Nếu không, nếu cả hai chuỗi ký tự đầu tiên giống nhau, hãy so sánh các ký tự thứ hai theo cùng một cách. 4. Lặp lại cho đến khi kết thúc một trong hai chuỗi. 5. Nếu cả hai chuỗi kết thúc ở cùng một độ dài, thì chúng bằng nhau. Nếu không, chuỗi dài hơn là lớn hơn. Trong các ví dụ trên, so sánh 'z'> 'a' có kết quả ở bước đầu tiên trong khi các chuỗi "phát sáng" và "glee" được so sánh từng ký tự: 1. g giống như g. 2. L giống như l. 3. O lớn hơn e. Dừng ở đây. Chuỗi đầu tiên lớn hơn.

Không phải là một từ điển thực sự, mà là thứ tự unicode

Thuật toán so sánh được đưa ra ở trên gần tương đương với thuật toán được sử dụng trong từ điển hoặc danh bạ điện thoại, nhưng nó không chính xác giống nhau. Ví dụ, các vấn đề trường hợp. Một chữ cái viết hoa "A" không bằng chữ thường "A". Cái nào lớn hơn? Chữ thường "A". Tại sao? Bởi vì ký tự thường có chỉ số lớn hơn trong bảng mã hóa nội bộ JavaScript sử dụng (unicode). Chúng tôi sẽ quay lại với các chi tiết và hậu quả cụ thể của điều này trong chuỗi chương.

So sánh các loại khác nhau khi so sánh các giá trị của các loại khác nhau, JavaScript chuyển đổi các giá trị thành số. Ví dụ:

cảnh báo ('2'> 1); // true, chuỗi '2' trở thành cảnh báo số 2 ('01' == 1); // true, chuỗi '01' trở thành số 1

Đối với các giá trị boolean, true trở thành 1 và false trở thành 0. Ví dụ:

cảnh báo (true == 1); // cảnh báo đúng (false == 0); // thật

Không phải là một từ điển thực sự, mà là thứ tự unicode

Thuật toán so sánh được đưa ra ở trên gần tương đương với thuật toán được sử dụng trong từ điển hoặc danh bạ điện thoại, nhưng nó không chính xác giống nhau. Ví dụ, các vấn đề trường hợp. Một chữ cái viết hoa "A" không bằng chữ thường "A". Cái nào lớn hơn? Chữ thường "A". Tại sao? Bởi vì ký tự thường có chỉ số lớn hơn trong bảng mã hóa nội bộ JavaScript sử dụng (unicode). Chúng tôi sẽ quay lại với các chi tiết và hậu quả cụ thể của điều này trong chuỗi chương.

So sánh các loại khác nhau khi so sánh các giá trị của các loại khác nhau, JavaScript chuyển đổi các giá trị thành số. Ví dụ:

cảnh báo ('2'> 1); // true, chuỗi '2' trở thành cảnh báo số 2 ('01' == 1); // true, chuỗi '01' trở thành số 1

Đối với các giá trị boolean, true trở thành 1 và false trở thành 0. Ví dụ:

cảnh báo (true == 1); // cảnh báo đúng (false == 0); // thật

Một hậu quả hài hước

Có thể là đồng thời: ●

Hai giá trị bằng nhau.

Một trong số đó là sự thật như một boolean và người còn lại là sai như một boolean.

Ví dụ:

Đặt A = 0; cảnh báo (boolean (a)); // Sai Đặt B = "0"; cảnh báo (boolean (b)); // cảnh báo thực (a == b); // thật!

Từ quan điểm của JavaScript, kết quả này khá bình thường. Kiểm tra bình đẳng chuyển đổi các giá trị bằng cách sử dụng chuyển đổi số (do đó "0" trở thành 0), trong khi chuyển đổi Boolean rõ ràng sử dụng một bộ quy tắc khác.

Bình đẳng nghiêm ngặt một kiểm tra bình đẳng thông thường == có vấn đề. Nó không thể phân biệt 0 với sai: cảnh báo (0 == false); // thật

Điều tương tự cũng xảy ra với một chuỗi trống:

cảnh báo ('' == false); // thật

Điều này xảy ra bởi vì các toán hạng của các loại khác nhau được chuyển đổi thành số bởi toán tử bình đẳng ==. Một chuỗi trống, giống như sai, trở thành số không. Phải làm gì nếu chúng tôi muốn phân biệt 0 với sai? Một toán tử bình đẳng nghiêm ngặt === Kiểm tra sự bình đẳng mà không cần chuyển đổi loại. Nói cách khác, nếu A và B thuộc các loại khác nhau, thì A === B ngay lập tức trả lại sai mà không cố gắng chuyển đổi chúng. Hãy thử nó:

cảnh báo (0 === sai); // sai, vì các loại khác nhau

Ngoài ra còn có một toán tử không bình đẳng nghiêm ngặt của người Viking! == Tương tự! =.

Nhà điều hành bình đẳng nghiêm ngặt là viết lâu hơn một chút, nhưng làm cho nó rõ ràng những gì xảy ra và để lại ít chỗ cho các lỗi.

Một giá trị không thể xác định được không thể xác định được không nên được so sánh với các giá trị khác:

cảnh báo (không xác định> 0); // sai (1) cảnh báo (không xác định <0); // Sai (2) cảnh báo (không xác định == 0); // Sai (3)

Tại sao nó không thích số không đến vậy? Luôn luôn sai! Chúng tôi nhận được những kết quả này vì: ●

So sánh (1) và (2) trả về sai vì không xác định được chuyển đổi thành NAN và NAN là một giá trị số đặc biệt trả về sai cho tất cả các so sánh. Kiểm tra bình đẳng (3) trả về sai vì không xác định chỉ bằng null, không xác định và không có giá trị nào khác.

Evade vấn đề Tại sao chúng ta đi qua những ví dụ này? Chúng ta có nên nhớ những đặc thù này mọi lúc không? Vâng, không thực sự. Trên thực tế, những điều khó khăn này sẽ dần trở nên quen thuộc theo thời gian, nhưng có một cách vững chắc để trốn tránh các vấn đề với chúng: chỉ cần đối xử với bất kỳ so sánh nào với không xác định/null ngoại trừ sự bình đẳng nghiêm ngặt === với sự chăm sóc đặc biệt. Don Tiết sử dụng so sánh> =>

Nhiệm vụ so sánh tầm quan trọng: 5 Kết quả cho các biểu thức này sẽ là gì? 5> 4 "Apple"> "dứa" "2"> "12" không xác định == null không xác định === null null == "\ n0 \ n" null === +"\ n0 \ n"

Để giải pháp

Tương tác: Cảnh báo, nhắc nhở, xác nhận trong phần này của hướng dẫn, chúng tôi đề cập đến ngôn ngữ JavaScript như là một người khác, không có các tinh chỉnh dành riêng cho môi trường. Nhưng chúng tôi vẫn sẽ sử dụng trình duyệt làm môi trường demo của chúng tôi, vì vậy chúng tôi nên biết ít nhất một vài chức năng giao diện người dùng của nó. Trong chương này, chúng tôi sẽ làm quen với cảnh báo chức năng trình duyệt, nhắc nhở và xác nhận.

Cú pháp cảnh báo:

Thông điệp cảnh báo);

Điều này cho thấy một thông báo và tạm dừng thực thi tập lệnh cho đến khi người dùng nhấn vào OK OK. Ví dụ:

cảnh báo ("Xin chào");

Cửa sổ mini với tin nhắn được gọi là cửa sổ phương thức. Từ ngữ Modal Modal có nghĩa là khách truy cập có thể tương tác với phần còn lại của trang, nhấn các nút khác, v.v. cho đến khi họ xử lý cửa sổ. Trong trường hợp này - cho đến khi họ nhấn vào OK OK.

Nhắc hàm nhắc Chức năng chấp nhận hai đối số: result = nhắc (Tiêu đề, [mặc định]);

Nó hiển thị một cửa sổ phương thức với tin nhắn văn bản, trường đầu vào cho khách truy cập và các nút OK/Hủy. tiêu đề văn bản để hiển thị khách truy cập. Mặc định một tham số thứ hai tùy chọn, giá trị ban đầu cho trường đầu vào. Khách truy cập có thể nhập một cái gì đó trong trường đầu vào nhắc nhở và nhấn OK. Hoặc họ có thể hủy đầu vào bằng cách nhấn Hủy hoặc nhấn phím ESC.

Cuộc gọi để nhắc trả về văn bản từ trường đầu vào hoặc null nếu đầu vào bị hủy. Ví dụ:

hãy để tuổi = nhắc nhở ('Bạn bao nhiêu tuổi?', ​​100); cảnh báo (`Bạn là $ {tuổi} tuổi!`); // Bạn đã 100 tuổi!

Trong IE: Luôn cung cấp mặc định

Tham số thứ hai là tùy chọn, nhưng nếu chúng tôi không cung cấp nó, Internet Explorer sẽ chèn văn bản "không xác định" vào dấu nhắc. Chạy mã này trong Internet Explorer để xem:

Đặt test = nhắc ("kiểm tra");

Vì vậy, để có lời nhắc trông đẹp trong IE, chúng tôi khuyên bạn nên luôn cung cấp đối số thứ hai:

Đặt test = nhắc nhở ("kiểm tra", ''); // 2015) {alert ('quá muộn'); } khác {alert ('chính xác!'); }

In the code above, JavaScript first checks year < 2015 . If that is falsy, it goes to the next condition year > 2015 . If that is also falsy, it shows the last alert . There can be more else if blocks. The final else is optional.

Toán tử có điều kiện ‘Đôi khi, chúng ta cần gán một biến tùy thuộc vào điều kiện. Ví dụ:

cho phép truy cập; hãy để tuổi = nhắc nhở ('Bạn bao nhiêu tuổi?', ​​''); if (tuổi> 18) {accessallowed = true; } other {accessallowed = false; } cảnh báo (accessallow);

Cái gọi là người điều khiển có điều kiện trực tuyến hoặc người điều khiển đánh dấu đánh dấu cho phép chúng tôi làm điều đó theo cách ngắn hơn và đơn giản hơn. Các nhà điều hành được đại diện bởi một dấu hỏi? . Đôi khi, nó được gọi là Ternary Ternary, bởi vì nhà điều hành có ba toán hạng. Nó thực sự là nhà điều hành một và duy nhất trong JavaScript có nhiều. Cú pháp là:

Đặt kết quả = điều kiện? Value1: value2;

Điều kiện được đánh giá: Nếu nó thật sự thật thì Value1 được trả về, nếu không - value2. Ví dụ:

Hãy để accessallow = (tuổi> 18)? đúng sai;

Về mặt kỹ thuật, chúng ta có thể bỏ qua các dấu ngoặc đơn vào khoảng 18 tuổi> 18. Toán tử đánh dấu câu hỏi có quyền ưu tiên thấp, do đó, nó thực hiện sau khi so sánh>. Ví dụ này sẽ làm điều tương tự như cái trước:

// Toán tử so sánh "Tuổi> 18" thực hiện đầu tiên // (không cần phải bọc nó thành dấu ngoặc đơn) hãy để accessalled = tuổi> 18? đúng sai;

Nhưng dấu ngoặc đơn làm cho mã dễ đọc hơn, vì vậy chúng tôi khuyên bạn nên sử dụng chúng.

Xin lưu ý:

Trong ví dụ trên, bạn có thể tránh sử dụng toán tử đánh dấu câu hỏi vì bản thân so sánh trả về đúng/sai: // cùng một người cho phép truy cập = tuổi> 18;

Nhiều ‘? Một chuỗi các toán tử đánh dấu câu hỏi? Có thể trả về một giá trị phụ thuộc vào nhiều điều kiện. Ví dụ:

hãy để tuổi = nhắc nhở ('tuổi?', ​​18);

hãy để tin nhắn = (tuổi <3)? 'Chào cưng!' : (Tuổi <18)? 'Xin chào!' : (Tuổi <100)? 'Lời chào hỏi!' : 'Thật là một độ tuổi bất thường!'; Thông điệp cảnh báo );

Lúc đầu, có thể khó nắm bắt được những gì đang diễn ra. Nhưng sau khi xem xét kỹ hơn, chúng ta có thể thấy rằng nó chỉ là một chuỗi các bài kiểm tra thông thường: 1. Dấu câu hỏi đầu tiên kiểm tra xem tuổi <3. 2. Nếu đúng - nó trở lại 'Xin chào, em yêu!' . Mặt khác, nó tiếp tục biểu hiện sau đại tràng ‘": ", kiểm tra tuổi <18. 3. Nếu điều đó đúng - nó sẽ trả về 'Xin chào!' . Mặt khác, nó tiếp tục biểu hiện sau đại tràng tiếp theo ‘": ", kiểm tra tuổi <100. 4. Nếu điều đó đúng - nó sẽ trả về 'lời chào!' . Nếu không, nó tiếp tục biểu hiện sau đại tràng cuối cùng ‘": ", trở lại 'thật là một thời đại bất thường!' . Ở đây, cách thức này trông bằng cách sử dụng if..else: if (tuổi

3) {= 'Xin chào, em yêu!'; (Tuổi <18) {= 'Xin chào!'; (tuổi <100) {= 'lời chào!'; = 'Thật là một độ tuổi bất thường!';

Việc sử dụng phi truyền thống của ‘? Đôi khi là dấu hỏi? được sử dụng để thay thế cho if: hãy để công ty = nhắc ('công ty nào đã tạo javascript?', ''); (công ty == 'Netscape')? cảnh báo ('phải!'): cảnh báo ('sai.');

Tùy thuộc vào điều kiện công ty == 'netscape', biểu thức thứ nhất hoặc thứ hai sau? được thực thi và hiển thị một cảnh báo. Chúng tôi không gán kết quả cho một biến ở đây. Thay vào đó, chúng tôi thực thi mã khác nhau tùy thuộc vào điều kiện. Chúng tôi không khuyên bạn nên sử dụng nhà điều hành đánh dấu câu hỏi theo cách này. Ký hiệu ngắn hơn câu lệnh IF tương đương, thu hút một số lập trình viên. Nhưng nó ít dễ đọc hơn. Đây là cùng một mã sử dụng nếu để so sánh:

Đặt công ty = nhắc ('công ty nào đã tạo ra javascript?', ''); if (công ty == 'netscape') {alert ('phải!'); } khác {alert ('sai.'); }

Mắt chúng ta quét mã theo chiều dọc. Các khối mã trải dài trên một số dòng dễ hiểu hơn một tập lệnh dài, ngang. Mục đích của toán tử đánh dấu câu hỏi? là trả về một giá trị hoặc một giá trị khác tùy thuộc vào điều kiện của nó. Vui lòng sử dụng nó cho chính xác điều đó. Sử dụng nếu khi bạn cần thực thi các nhánh khác nhau của mã.

Nhiệm vụ nếu (một chuỗi có không) tầm quan trọng: 5 sẽ cảnh báo được hiển thị? if ("0") {alert ('xin chào'); }

Để giải pháp

Tên của JavaScript Tầm quan trọng: 2 Sử dụng cấu trúc IF..else, hãy viết mã hỏi: 'Tên chính thức của JavaScript là gì?' Đầu ra: “Không biết? Ecmascript! ”

Bản demo trong cửa sổ mới

Để giải pháp

Tên của JavaScript Tầm quan trọng: 2 Sử dụng cấu trúc IF..else, hãy viết mã hỏi: 'Tên chính thức của JavaScript là gì?' Đầu ra: “Không biết? Ecmascript! ”

Bản demo trong cửa sổ mới

Hiển thị tầm quan trọng của dấu hiệu: 2 Sử dụng if..else, hãy viết mã nhận được số qua dấu nhắc và sau đó hiển thị trong cảnh báo: ●

Hiển thị tầm quan trọng của dấu hiệu: 2 Sử dụng if..else, hãy viết mã nhận được số qua dấu nhắc và sau đó hiển thị trong cảnh báo: ●

1, nếu giá trị lớn hơn 0,

Để giải pháp

Tên của JavaScript Tầm quan trọng: 2 Sử dụng cấu trúc IF..else, hãy viết mã hỏi: 'Tên chính thức của JavaScript là gì?' Đầu ra: “Không biết? Ecmascript! ”

Để giải pháp

Tên của JavaScript Tầm quan trọng: 2 Sử dụng cấu trúc IF..else, hãy viết mã hỏi: 'Tên chính thức của JavaScript là gì?' Đầu ra: “Không biết? Ecmascript! ”

Bản demo trong cửa sổ mới

Để giải pháp

Tên của JavaScript Tầm quan trọng: 2 Sử dụng cấu trúc IF..else, hãy viết mã hỏi: 'Tên chính thức của JavaScript là gì?' Đầu ra: “Không biết? Ecmascript! ”

Bản demo trong cửa sổ mới

Hiển thị tầm quan trọng của dấu hiệu: 2 Sử dụng if..else, hãy viết mã nhận được số qua dấu nhắc và sau đó hiển thị trong cảnh báo: ●

1, nếu giá trị lớn hơn 0,

-1, nếu ít hơn 0,

0, nếu bằng không.

Trong nhiệm vụ này, chúng tôi cho rằng đầu vào luôn là một số. Bản demo trong cửa sổ mới

Hầu hết thời gian, hoặc || được sử dụng trong một câu lệnh IF để kiểm tra nếu bất kỳ điều kiện đã cho là đúng. Ví dụ:

Viết lại 'nếu..else' thành '?' Tầm quan trọng: 5 Viết lại nếu..else sử dụng nhiều toán tử ternary '?' . Đối với khả năng đọc, nó khuyến nghị chia mã thành nhiều dòng. Hãy để tin nhắn; if (thông báo đăng nhập} khác nếu tin nhắn} khác nếu tin nhắn} khác {

Chúng ta có thể vượt qua nhiều điều kiện hơn:

tin nhắn = ''; }

Hoặc tìm thấy giá trị sự thật đầu tiên mà logic được mô tả ở trên là hơi cổ điển. Bây giờ, hãy để Lừa mang theo các tính năng bổ sung của JavaScript. Thuật toán mở rộng hoạt động như sau. Đưa ra nhiều giá trị hoặc có giá trị:

result = value1 || Value2 || Value3;

Hoặc || Nhà điều hành làm như sau: ●

Đánh giá các toán hạng từ trái sang phải. Đối với mỗi toán hạng, chuyển đổi nó thành boolean. Nếu kết quả là đúng, hãy dừng và trả về giá trị ban đầu của toán hạng đó. Nếu tất cả các toán hạng đã được đánh giá (nghĩa là tất cả đều sai), hãy trả về toán hạng cuối cùng.

Một giá trị được trả về ở dạng ban đầu, mà không cần chuyển đổi. Nói cách khác, một chuỗi hoặc "||" Trả về giá trị sự thật đầu tiên hoặc giá trị cuối cùng nếu không tìm thấy giá trị sự thật. Ví dụ:

cảnh báo (1 || 0); // 1 (1 là sự thật) cảnh báo (Đúng || 'bất kể điều gì'); // (đúng là sự thật) cảnh báo (null || 1); // 1 (1 là giá trị sự thật đầu tiên) cảnh báo (null || 0 || 1); // 1 (giá trị sự thật đầu tiên) cảnh báo (không xác định || null || 0); // 0 (tất cả giả mạo, trả về giá trị cuối cùng)

Điều này dẫn đến một số cách sử dụng thú vị so với một người tinh khiết, cổ điển, chỉ có boolean hoặc chỉ có. 1. Nhận giá trị sự thật đầu tiên từ danh sách các biến hoặc biểu thức.

Hãy tưởng tượng chúng ta có một danh sách các biến có thể chứa dữ liệu hoặc không được xác định. Làm thế nào chúng ta có thể tìm thấy cái đầu tiên có dữ liệu? Chúng ta có thể sử dụng hoặc | | : hãy để currentUser = null; hãy để DefaultUser = "John"; Đặt tên = currentUser || DefaultUser || "vô danh"; cảnh báo (tên); // chọn "John" - giá trị sự thật đầu tiên

Nếu cả CurrentUser và DefaultUser đều giả mạo, "không tên" sẽ là kết quả. 2. Đánh giá ngắn mạch. Toán tử có thể không chỉ là các giá trị, mà còn là các biểu thức tùy ý. Hoặc đánh giá và kiểm tra chúng từ trái sang phải. Việc đánh giá dừng lại khi đạt được giá trị sự thật và giá trị được trả về. Quá trình này được gọi là đánh giá ngắn mạch vì nó đi càng ngắn càng tốt từ trái sang phải. Điều này được thấy rõ khi biểu thức được đưa ra là đối số thứ hai có tác dụng phụ giống như một bài tập biến. Trong ví dụ dưới đây, x không được gán: Đặt x; Đúng || (x = 1); cảnh báo (x); // không xác định, vì (x = 1) không được đánh giá

Nếu, thay vào đó, đối số đầu tiên là sai, || Đánh giá cái thứ hai, do đó chạy bài tập:

Đặt x; sai || (x = 1); cảnh báo (x); // 1

Một bài tập là một trường hợp đơn giản. Có thể có các tác dụng phụ, won won xuất hiện nếu đánh giá không tiếp cận được với họ. Như chúng ta có thể thấy, một trường hợp sử dụng như vậy là "cách làm ngắn hơn nếu". Toán tử đầu tiên được chuyển đổi thành Boolean. Nếu nó sai, cái thứ hai được đánh giá. Hầu hết thời gian, nó tốt hơn là sử dụng một loại thường xuyên, nếu giữ mã dễ hiểu, nhưng đôi khi điều này có thể tiện dụng.

&& (VÀ)

Toán tử và được biểu diễn với hai ampersands &&: result = a && b;

Trong lập trình cổ điển và trả về đúng nếu cả hai toán hạng là sự thật và sai nếu không:

cảnh báo (cảnh báo (cảnh báo (cảnh báo (

đúng rồi ); sai đúng ); đúng sai ); sai && sai);

// // // //

Đúng sai sai

Một ví dụ với if: hãy để giờ = 12; Đặt phút = 30; if (giờ == 12 && phút == 30) {alert ('thời gian là 12:30'); }

Giống như với hoặc, bất kỳ giá trị nào được cho phép như một toán hạng của và:

if (1 && 0) {// được đánh giá là đúng && false alert ("sẽ không hoạt động, vì kết quả là giả"); }

Và tìm thấy giá trị giả đầu tiên được đưa ra nhiều giá trị và giá trị:

result = value1 && value2 && value3;

Toán tử và && thực hiện như sau: ●

Đánh giá các toán hạng từ trái sang phải. Đối với mỗi toán hạng, chuyển đổi nó thành boolean. Nếu kết quả là đúng, hãy dừng và trả về giá trị ban đầu của toán hạng đó. Nếu tất cả các toán hạng đã được đánh giá (nghĩa là tất cả đều sai), hãy trả về toán hạng cuối cùng.

Một giá trị được trả về ở dạng ban đầu, mà không cần chuyển đổi. Nói cách khác, một chuỗi hoặc "||" Trả về giá trị sự thật đầu tiên hoặc giá trị cuối cùng nếu không tìm thấy giá trị sự thật. Ví dụ:

cảnh báo (1 || 0); // 1 (1 là sự thật) cảnh báo (Đúng || 'bất kể điều gì'); // (đúng là sự thật) cảnh báo (null || 1); // 1 (1 là giá trị sự thật đầu tiên) cảnh báo (null || 0 || 1); // 1 (giá trị sự thật đầu tiên) cảnh báo (không xác định || null || 0); // 0 (tất cả giả mạo, trả về giá trị cuối cùng)

Điều này dẫn đến một số cách sử dụng thú vị so với một người tinh khiết, cổ điển, chỉ có boolean hoặc chỉ có. 1. Nhận giá trị sự thật đầu tiên từ danh sách các biến hoặc biểu thức.

cảnh báo (1 && 2 && null && 3); // vô giá trị

Khi tất cả các giá trị là sự thật, giá trị cuối cùng được trả về:

cảnh báo (1 && 2 && 3); // 3, cái cuối cùng

Ưu tiên của và && cao hơn hoặc ||

Độ ưu tiên của toán tử và && toán tử cao hơn hoặc || . Vì vậy, mã A && B || C && D về cơ bản giống như các biểu thức && nằm trong ngoặc đơn: (A && B) || (đĩa CD) . Chỉ giống như hoặc, toán tử AND && đôi khi có thể thay thế nếu. Ví dụ:

Đặt x = 1; (x> 0) && alert ('lớn hơn 0!');

Hành động ở phần bên phải của && sẽ chỉ thực thi nếu đánh giá đạt đến nó. Nghĩa là, chỉ khi (x> 0) là đúng. Vì vậy, về cơ bản chúng tôi có một chất tương tự cho:

Đặt x = 1; if (x> 0) {alert ('lớn hơn 0!'); }

Biến thể với && xuất hiện ngắn hơn. Nhưng nếu rõ ràng hơn và có xu hướng dễ đọc hơn một chút.

Vì vậy, chúng tôi khuyên bạn nên sử dụng mọi cấu trúc cho mục đích của nó: sử dụng nếu chúng tôi muốn nếu và sử dụng && nếu chúng tôi muốn và.

!! (Không) Nhà điều hành không Boolean được biểu thị bằng dấu chấm than! . Cú pháp khá đơn giản:

kết quả =! Giá trị;

Nhà điều hành chấp nhận một đối số duy nhất và thực hiện như sau: 1. Chuyển đổi toán hạng thành loại boolean: true/false. 2. Trả về giá trị nghịch đảo. Ví dụ:

cảnh báo (! đúng); // Cảnh báo sai (! 0); // thật

Một đôi không !! đôi khi được sử dụng để chuyển đổi một giá trị thành loại boolean: cảnh báo (!! "chuỗi không trống"); // cảnh báo thực sự (!! null); // sai

Đó là, thứ nhất không chuyển đổi giá trị thành boolean và trả về nghịch đảo, và thứ hai không đảo ngược nó một lần nữa. Cuối cùng, chúng tôi có một chuyển đổi giá trị đơn giản thành Boolean. Có một cách khác nhau một chút để làm điều tương tự-một chức năng boolean tích hợp: alert (boolean ("chuỗi không trống")); // cảnh báo thực sự (boolean (null)); // sai

Sự ưu tiên của không! là cao nhất trong tất cả các toán tử logic, vì vậy nó luôn thực hiện đầu tiên, trước && hoặc || .

Nhiệm vụ kết quả của hoặc? Tầm quan trọng: 5 Mã dưới đây sẽ đầu ra là gì? cảnh báo (null || 2 || không xác định);

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Kết quả của và? Tầm quan trọng: 5 Mã này sẽ hiển thị gì? cảnh báo (1 && null && 2);

Kết quả của và cảnh báo là gì? Tầm quan trọng: 3 Mã này sẽ hiển thị gì? cảnh báo (cảnh báo (1) && alert (2));

Kết quả của hoặc và hoặc quan trọng: 5 Kết quả sẽ là gì? cảnh báo (null || 2 && 3 || 4);

Để giải pháp

Kết quả của cảnh báo hoặc là gì? Tầm quan trọng: 3 Mã dưới đây sẽ gì? cảnh báo (cảnh báo (1) || 2 || cảnh báo (3));

Kết quả của và? Tầm quan trọng: 5 Mã này sẽ hiển thị gì? cảnh báo (1 && null && 2);

Kết quả của và cảnh báo là gì? Tầm quan trọng: 3 Mã này sẽ hiển thị gì? cảnh báo (cảnh báo (1) && alert (2));

Kết quả của hoặc và hoặc quan trọng: 5 Kết quả sẽ là gì? cảnh báo (null || 2 && 3 || 4);

Kết quả của và cảnh báo là gì? Tầm quan trọng: 3 Mã này sẽ hiển thị gì? cảnh báo (cảnh báo (1) && alert (2));

Kết quả của hoặc và hoặc quan trọng: 5 Kết quả sẽ là gì? cảnh báo (null || 2 && 3 || 4);

Kiểm tra phạm vi giữa tầm quan trọng: 3 Viết một điều kiện IF IF để kiểm tra xem tuổi đó từ 14 đến 90.

Một cách toàn diện có nghĩa là tuổi có thể đạt đến các cạnh 14 hoặc 90. Để giải pháp

Kiểm tra phạm vi tầm quan trọng bên ngoài: 3 Viết một điều kiện nếu kiểm tra xem tuổi đó không nằm trong khoảng từ 14 đến 90. Tạo hai biến thể: Cái đầu tiên sử dụng không! , cái thứ hai - không có nó. Để giải pháp

Một câu hỏi về "nếu" tầm quan trọng: 5 cảnh báo nào sẽ thực thi? Kết quả của các biểu thức sẽ là gì bên trong nếu (...)? if (-1 || 0) cảnh báo ('đầu tiên'); if (-1 && 0) cảnh báo ('thứ hai'); if (null || -1 && 1) cảnh báo ('thứ ba');

Kiểm tra tầm quan trọng đăng nhập: 3 Viết mã yêu cầu đăng nhập bằng lời nhắc. Nếu khách truy cập nhập "Quản trị viên", thì hãy nhắc mật khẩu, nếu đầu vào là một dòng trống hoặc ESC - hiển thị đã bị hủy. Mật khẩu được kiểm tra như sau: ●

Nếu nó bằng với những người theo chủ đề, thì hãy hiển thị chào mừng!

Niềng răng xoăn không bắt buộc cho một cơ thể một dòng

Nếu cơ thể vòng lặp có một câu lệnh duy nhất, chúng ta có thể bỏ qua niềng răng xoăn {Mạnh}: hãy để i = 3; while (i) cảnh báo (i--);

Các trò chơi trong khi vòng lặp trong khi kiểm tra điều kiện có thể được di chuyển bên dưới thân vòng bằng cách sử dụng Do. trong khi cú pháp: do {// Loop body} while (điều kiện);

Vòng lặp trước tiên sẽ thực thi cơ thể, sau đó kiểm tra tình trạng, và, trong khi đó, sự thật của nó, thực hiện nó nhiều lần. Ví dụ:

Đặt i = 0; làm {alert (i); i ++; } trong khi (i <3);

Hình thức cú pháp này chỉ nên được sử dụng khi bạn muốn phần thân của vòng lặp thực thi ít nhất một lần bất kể điều kiện là sự thật. Thông thường, biểu mẫu khác được ưa thích: trong khi (phạm) {{}.

Vòng lặp For For For For For là vòng lặp được sử dụng phổ biến nhất. Có vẻ như thế này:

for (started; điều kiện; bước) {// ... thân vòng ...}

Ví dụ, hãy để học ý nghĩa của các phần này. Vòng lặp bên dưới chạy cảnh báo (i) cho i từ 0 đến (nhưng không bao gồm) 3: for (let i = 0; i <3; i ++) {// hiển thị 0, sau đó 1, sau đó 2 cảnh báo (i); }

Hãy để kiểm tra các câu tuyên bố một phần: một phần bắt đầu

i = 0

Thực hiện một lần khi vào vòng lặp.

tình trạng

Tôi <3

Đã kiểm tra trước mỗi lần lặp lại vòng lặp. Nếu sai, vòng lặp dừng lại.

bươc

i ++

Thực hiện sau cơ thể trên mỗi lần lặp nhưng trước khi kiểm tra điều kiện.

thân hình

cảnh báo (i)

Chạy hết lần này đến lần khác trong khi điều kiện là sự thật.

Thuật toán vòng lặp chung hoạt động như thế này:

Chạy bắt đầu → (nếu điều kiện → chạy cơ thể và bước chạy) → (nếu điều kiện → chạy cơ thể và bước chạy) → (nếu điều kiện → chạy cơ thể chạy và bước chạy) → ... ...

Nếu bạn chưa quen với các vòng lặp, nó có thể giúp quay lại ví dụ và tái tạo cách nó chạy bước Step trên một mảnh giấy.

Ở đây, chính xác những gì xảy ra trong trường hợp của chúng tôi:

// for (let i = 0; i <3; i ++) cảnh báo (i) // chạy bắt đầu let i = 0 // nếu điều kiện → chạy cơ thể và if (i <3) {alert (i); i ++} // nếu điều kiện → chạy cơ thể và if (i <3) {alert (i); i ++} // nếu điều kiện → chạy cơ thể và if (i <3) {alert (i); i ++} // ... kết thúc, vì bây giờ tôi ==

Chạy bước chạy bước chạy Bước 3

Tuyên bố biến nội tuyến

Ở đây, biến số bộ đếm trên mạng mà tôi được tuyên bố ngay trong vòng lặp. Đây được gọi là một tuyên bố biến nội tuyến trực tuyến. Các biến như vậy chỉ có thể nhìn thấy bên trong vòng lặp.

for (let i = 0; i <3; i ++) {alert (i); // 0, 1, 2} cảnh báo (i); // lỗi, không có biến như vậy

Thay vì xác định một biến, chúng tôi có thể sử dụng một biến hiện có:

Đặt i = 0; for (i = 0; i <3; i ++) {// sử dụng cảnh báo biến hiện có (i); // 0, 1, 2} cảnh báo (i); // 3, có thể nhìn thấy, bởi vì được tuyên bố bên ngoài vòng lặp

Bỏ qua các bộ phận bất kỳ phần nào của cho có thể được bỏ qua. Ví dụ, chúng ta có thể bỏ qua bắt đầu nếu chúng ta không cần phải làm bất cứ điều gì khi bắt đầu vòng lặp. Như ở đây:

Đặt i = 0; // Chúng tôi đã tuyên bố và gán cho (; i <3; i ++) {// không cần cảnh báo "bắt đầu" (i); // 0, 1, 2}

Chúng tôi cũng có thể loại bỏ phần bước:

Đặt i = 0; for (; i <3;) {alert (i ++); }

Điều này làm cho vòng lặp giống hệt nhau (i <3). Chúng ta thực sự có thể loại bỏ mọi thứ, tạo ra một vòng lặp vô hạn:

for (;;) {// lặp lại mà không giới hạn}

Xin lưu ý rằng hai cho dấu chấm phẩy; phải có mặt. Nếu không, sẽ có một lỗi cú pháp.

Phá vỡ vòng lặp bình thường, một vòng lặp thoát ra khi tình trạng của nó trở nên giả. Nhưng chúng ta có thể buộc lối ra bất cứ lúc nào bằng cách sử dụng Chỉ thị Break đặc biệt. Ví dụ: vòng lặp bên dưới yêu cầu người dùng cho một loạt các số, thì Break Breaking khi không có số nào được nhập:

Đặt tổng = 0; while (true) {let value = +nhắc nhở ("nhập một số", ''); if (! giá trị) phá vỡ; // (*) sum += value; } cảnh báo ('sum:' + sum);

Chỉ thị ngắt được kích hoạt ở dòng (*) nếu người dùng nhập một dòng trống hoặc hủy đầu vào. Nó dừng vòng lặp ngay lập tức, chuyển điều khiển đến dòng đầu tiên sau vòng lặp. Cụ thể, cảnh báo. Sự kết hợp của Infinite Loop + break khi cần thiết là rất tốt cho các tình huống khi một điều kiện vòng lặp phải được kiểm tra không phải ở đầu hoặc cuối của vòng lặp, mà ở giữa hoặc thậm chí ở một số nơi của cơ thể.

Tiếp tục đến lần lặp tiếp theo

Chỉ thị tiếp tục là một phiên bản nhẹ hơn của người Viking. Nó không dừng lại toàn bộ vòng lặp. Thay vào đó, nó dừng lần lặp hiện tại và buộc vòng lặp phải bắt đầu một vòng mới (nếu điều kiện cho phép). Chúng tôi có thể sử dụng nó nếu chúng tôi thực hiện với lần lặp hiện tại và muốn chuyển sang cái tiếp theo. Vòng lặp bên dưới sử dụng tiếp tục chỉ xuất ra các giá trị lẻ: for (let i = 0; i <10; i ++) {// Nếu đúng, bỏ qua phần còn lại của cơ thể nếu (i % 2 == 0) tiếp tục; cảnh báo (i); // 1, sau đó 3, 5, 7, 9}

Đối với các giá trị chẵn của I, chỉ thị tiếp tục dừng thực thi cơ thể và chuyển quyền kiểm soát cho lần lặp tiếp theo của FOR (với số tiếp theo). Vì vậy, cảnh báo chỉ được gọi cho các giá trị lẻ.

Chỉ thị tiếp tục giúp giảm làm tổ

Một vòng lặp hiển thị các giá trị lẻ có thể trông như thế này:

for (let i = 0; i <10; i ++) {if (i % 2) {alert (i); }}

Từ quan điểm kỹ thuật, điều này giống hệt với ví dụ trên. Chắc chắn, chúng ta chỉ có thể bọc mã trong một khối IF thay vì sử dụng tiếp tục. Nhưng như một tác dụng phụ, điều này đã tạo ra thêm một mức độ làm tổ (cuộc gọi cảnh báo bên trong niềng răng xoăn). Nếu mã bên trong IF dài hơn một vài dòng, điều đó có thể làm giảm khả năng đọc tổng thể.

Không nghỉ/tiếp tục sang bên phải của ‘?

Xin lưu ý rằng các cấu trúc cú pháp không phải là biểu thức không thể được sử dụng với toán tử ternary? . Cụ thể, các chỉ thị như Break/Tiếp tục aren cho phép ở đó. Ví dụ: nếu chúng ta lấy mã này:

if (i> 5) {alert (i); } khác {Tiếp tục; }

… Và viết lại nó bằng một dấu hỏi:

(i> 5)? Cảnh báo (i): Tiếp tục; // Tiếp tục không được phép ở đây

… Nó ngừng hoạt động. Mã như thế này sẽ gây ra lỗi cú pháp: Đây chỉ là một lý do khác để không sử dụng toán tử đánh dấu câu hỏi? thay vì nếu.

Nhãn cho Break/Tiếp tục Đôi khi chúng ta cần thoát ra khỏi nhiều vòng lồng nhau cùng một lúc. Ví dụ: trong mã bên dưới, chúng tôi lặp qua I và J, nhắc nhở tọa độ (i, j) từ (0,0) đến (3,3): for (hãy để i = 0; i <3; i ++) { for (let j = 0; j <3; j ++) {let input = prompt (`value at coords ($ {i}, $ {j})`, ''); // Điều gì sẽ xảy ra nếu tôi muốn thoát khỏi đây để thực hiện (bên dưới)? }} cảnh báo ('Xong!');

Chúng tôi cần một cách để dừng quá trình nếu người dùng hủy đầu vào. Sự phá vỡ thông thường sau khi đầu vào sẽ chỉ phá vỡ vòng bên trong. Rằng không đủ nhãn hiệu, hãy đến giải cứu! Một nhãn là một định danh với một dấu hai chấm trước một vòng lặp:

LabelName: for (...) {...

}

Câu lệnh ngắt trong vòng lặp bên dưới bị hỏng vào nhãn: bên ngoài: for (let i = 0; i <3; i ++) {for (let j = 0; j <3; j ++) {let input = press tại các phối hợp ($ {i}, $ {j}) `, ''); // Nếu một chuỗi trống hoặc bị hủy, sau đó thoát ra khỏi cả hai vòng nếu (! đầu vào) bị hỏng bên ngoài; // (*) // làm một cái gì đó với giá trị ...}} cảnh báo ('Xong!');

Trong mã trên, phá vỡ bên ngoài nhìn lên trên cho nhãn có tên bên ngoài và thoát ra khỏi vòng lặp đó. Vì vậy, điều khiển đi thẳng từ (*) để cảnh báo ('Xong!'). Chúng ta cũng có thể di chuyển nhãn vào một dòng riêng biệt:

Bên ngoài: for (let i = 0; i <3; i ++) {...}

Chỉ thị tiếp tục cũng có thể được sử dụng với một nhãn. Trong trường hợp này, thực thi mã nhảy sang lần lặp tiếp theo của vòng lặp được dán nhãn.

Không nghỉ/tiếp tục sang bên phải của ‘?

Xin lưu ý rằng các cấu trúc cú pháp không phải là biểu thức không thể được sử dụng với toán tử ternary? . Cụ thể, các chỉ thị như Break/Tiếp tục aren cho phép ở đó. Ví dụ: nếu chúng ta lấy mã này:

if (i> 5) {alert (i); } khác {Tiếp tục; }

… Và viết lại nó bằng một dấu hỏi:

(i> 5)? Cảnh báo (i): Tiếp tục; // Tiếp tục không được phép ở đây

… Nó ngừng hoạt động. Mã như thế này sẽ gây ra lỗi cú pháp: Đây chỉ là một lý do khác để không sử dụng toán tử đánh dấu câu hỏi? thay vì nếu.

Nhãn cho Break/Tiếp tục Đôi khi chúng ta cần thoát ra khỏi nhiều vòng lồng nhau cùng một lúc. Ví dụ: trong mã bên dưới, chúng tôi lặp qua I và J, nhắc nhở tọa độ (i, j) từ (0,0) đến (3,3): for (hãy để i = 0; i <3; i ++) { for (let j = 0; j <3; j ++) {let input = prompt (`value at coords ($ {i}, $ {j})`, ''); // Điều gì sẽ xảy ra nếu tôi muốn thoát khỏi đây để thực hiện (bên dưới)? }} cảnh báo ('Xong!');

Chúng tôi cần một cách để dừng quá trình nếu người dùng hủy đầu vào. Sự phá vỡ thông thường sau khi đầu vào sẽ chỉ phá vỡ vòng bên trong. Rằng không đủ nhãn hiệu, hãy đến giải cứu! Một nhãn là một định danh với một dấu hai chấm trước một vòng lặp:

LabelName: for (...) {...

}

LabelName: for (...) {...

}

Câu lệnh ngắt trong vòng lặp bên dưới bị hỏng vào nhãn: bên ngoài: for (let i = 0; i <3; i ++) {for (let j = 0; j <3; j ++) {let input = press tại các phối hợp ($ {i}, $ {j}) `, ''); // Nếu một chuỗi trống hoặc bị hủy, sau đó thoát ra khỏi cả hai vòng nếu (! đầu vào) bị hỏng bên ngoài; // (*) // làm một cái gì đó với giá trị ...}} cảnh báo ('Xong!');

Trong mã trên, phá vỡ bên ngoài nhìn lên trên cho nhãn có tên bên ngoài và thoát ra khỏi vòng lặp đó. Vì vậy, điều khiển đi thẳng từ (*) để cảnh báo ('Xong!'). Chúng ta cũng có thể di chuyển nhãn vào một dòng riêng biệt:

Bên ngoài: for (let i = 0; i <3; i ++) {...}

Chỉ thị tiếp tục cũng có thể được sử dụng với một nhãn. Trong trường hợp này, thực thi mã nhảy sang lần lặp tiếp theo của vòng lặp được dán nhãn.

Nhãn không phải là một "goto"

Bên ngoài: for (let i = 0; i <3; i ++) {...}

Chỉ thị tiếp tục cũng có thể được sử dụng với một nhãn. Trong trường hợp này, thực thi mã nhảy sang lần lặp tiếp theo của vòng lặp được dán nhãn.

Nhãn không phải là một "goto"

Bên ngoài: for (let i = 0; i <3; i ++) {...}

Chỉ thị tiếp tục cũng có thể được sử dụng với một nhãn. Trong trường hợp này, thực thi mã nhảy sang lần lặp tiếp theo của vòng lặp được dán nhãn.

Nhãn không phải là một "goto"

Để giải pháp

Lặp lại cho đến khi đầu vào có tầm quan trọng chính xác: 5

Viết một vòng lặp nhắc nhở một số lớn hơn 100. Nếu khách truy cập vào một số khác - yêu cầu họ nhập lại. Vòng lặp phải yêu cầu một số cho đến khi khách truy cập nhập một số lớn hơn 100 hoặc hủy bỏ đầu vào/nhập một dòng trống. Ở đây chúng tôi có thể giả định rằng khách truy cập chỉ nhập số. Không cần phải thực hiện một xử lý đặc biệt cho một đầu vào không phải là số trong nhiệm vụ này. Chạy bản demo để giải pháp

Đầu ra Số nguyên tố quan trọng: 3 Số nguyên lớn hơn 1 được gọi là phần còn lại của bất cứ thứ gì ngoại trừ 1 và chính nó.

Nếu nó không thể được chia mà không có

Nói cách khác, n> 1 là một nguyên tố nếu nó có thể chia đều cho bất cứ thứ gì ngoại trừ 1 và n. Ví dụ, 5 là số nguyên tố, vì nó không thể được chia mà không có phần còn lại cho 2, 3 và 4. Viết mã xuất ra số nguyên tố trong khoảng từ 2 đến n. Đối với n = 10, kết quả sẽ là 2,3,5,7. P.S. Mã sẽ hoạt động cho bất kỳ n, không được điều chỉnh cứng cho bất kỳ giá trị cố định nào. Để giải pháp

Câu lệnh "SWITCH" Một câu lệnh chuyển đổi có thể thay thế nhiều kiểm tra nếu kiểm tra. Nó đưa ra một cách mô tả hơn để so sánh một giá trị với nhiều biến thể.

Cú pháp Công tắc có một hoặc nhiều khối trường hợp và mặc định tùy chọn. Có vẻ như thế này:

Switch (x) {case 'value1': ... [break] case 'value2': ...

// if (x === 'value1')

// if (x === 'value2')

[break] mặc định: ... [break]}

Giá trị của x được kiểm tra cho một bình đẳng nghiêm ngặt với giá trị từ trường hợp đầu tiên (nghĩa là, value1) sau đó đến thứ hai (value2), v.v. Nếu tìm thấy sự bình đẳng, công tắc bắt đầu thực thi mã bắt đầu từ trường hợp tương ứng, cho đến khi ngắt gần nhất (hoặc cho đến khi kết thúc công tắc). Nếu không có trường hợp nào được khớp thì mã mặc định được thực thi (nếu nó tồn tại).

Một ví dụ Một ví dụ về công tắc (mã được thực thi được tô sáng): Đặt A = 2 + 2; Switch (A) Trường hợp 3: Cảnh báo (Break; Trường hợp 4: Cảnh báo (Break; Trường hợp 5: Cảnh báo (Break; Mặc định: Alert (}

{ 'Quá nhỏ' );

'Một cách chính xác!' );

'Quá rộng' );

"Tôi không biết các giá trị như vậy");

Ở đây, công tắc bắt đầu so sánh một biến thể trường hợp đầu tiên là 3. Trận đấu thất bại. Sau đó 4. Đó là một trận đấu, vì vậy việc thực hiện bắt đầu từ trường hợp 4 cho đến khi nghỉ gần nhất. Nếu không có sự phá vỡ thì việc thực hiện tiếp tục với trường hợp tiếp theo mà không có kiểm tra nào. Một ví dụ không bị phá vỡ: Đặt A = 2 + 2; Switch (a) Trường hợp 3: cảnh báo (trường hợp 4: cảnh báo (trường hợp 5: cảnh báo (mặc định:

{ 'Quá nhỏ' ); 'Một cách chính xác!' ); 'Quá lớn' );

cảnh báo ("Tôi không biết các giá trị như vậy"); }

Trong ví dụ trên, chúng tôi sẽ thấy thực hiện tuần tự ba cảnh báo s: alert ('chính xác!'); cảnh báo ('quá lớn'); cảnh báo ("Tôi không biết các giá trị như vậy");

Bất kỳ biểu thức nào cũng có thể là đối số chuyển đổi/trường hợp

Cả chuyển đổi và trường hợp cho phép biểu thức tùy ý. Ví dụ:

Đặt a = "1"; Đặt b = 0; chuyển đổi ( +a) {case b +1: cảnh báo ("điều này chạy, bởi vì +a là 1, chính xác bằng b +1"); phá vỡ; Mặc định: cảnh báo ("Điều này không chạy"); }

Ở đây + A cho 1, mà so sánh với B + 1 trong trường hợp và mã tương ứng được thực thi.

Việc nhóm các trường hợp của người Viking Một số biến thể của trường hợp có chung mã có thể được nhóm lại. Ví dụ: nếu chúng ta muốn cùng một mã chạy cho trường hợp 3 và trường hợp 5: Đặt A = 2 + 2; chuyển đổi (a) {trường hợp 4: cảnh báo ('phải!'); phá vỡ; trường hợp 3: // (*) nhóm hai trường hợp trường hợp 5: cảnh báo ('sai!'); cảnh báo ("Tại sao bạn không tham gia một lớp toán?"); phá vỡ; mặc định:

cảnh báo ('kết quả là lạ. Thực sự.'); }

Bây giờ cả 3 và 5 hiển thị cùng một thông điệp. Khả năng của nhóm các trường hợp của nhóm là một tác dụng phụ về cách chuyển đổi/trường hợp hoạt động mà không bị phá vỡ. Ở đây, việc thực hiện trường hợp 3 bắt đầu từ dòng (*) và trải qua trường hợp 5, bởi vì không có sự phá vỡ.

Các vấn đề loại hãy để nhấn mạnh rằng kiểm tra bình đẳng luôn luôn nghiêm ngặt. Các giá trị phải có cùng loại để khớp. Ví dụ: hãy để xem xét mã:

Đặt arg = nhắc nhở ("Nhập một giá trị?"); chuyển đổi (arg) {case '0': case '1': alert ('một hoặc không'); phá vỡ; trường hợp '2': cảnh báo ('hai'); phá vỡ; trường hợp 3: cảnh báo ('không bao giờ thực thi!'); phá vỡ; Mặc định: cảnh báo ('một giá trị không xác định'); }

1. Đối với 0, 1, cảnh báo đầu tiên chạy. 2. cho 2 cảnh báo thứ hai chạy. 3. Nhưng đối với 3, kết quả của lời nhắc là một chuỗi "3", không hoàn toàn bằng nhau === đến số 3. Vì vậy, chúng tôi đã có một mã chết trong trường hợp 3! Biến thể mặc định sẽ thực thi.

✔ Nhiệm vụ viết lại "công tắc" thành một "if" tầm quan trọng: 5 Viết mã bằng cách sử dụng if..else sẽ tương ứng với công tắc sau: switch (trình duyệt) {case 'edge': alert ("Bạn có cạnh ! "); phá vỡ;

trường hợp 'chrome': trường hợp 'firefox': trường hợp 'safari': trường hợp 'opera': cảnh báo ('Được rồi, chúng tôi cũng hỗ trợ các trình duyệt này'); phá vỡ; Mặc định: Cảnh báo ('Chúng tôi hy vọng rằng trang này có vẻ ổn!'); }

Để giải pháp

Viết lại "nếu" thành "chuyển đổi" tầm quan trọng: 4 viết lại mã bên dưới bằng cách sử dụng một câu lệnh chuyển đổi duy nhất: Đặt A = +nhắc nhở ('A?', ''); if (a == alert (} if (a == alert (}

0) {0); 1) {1);

if (a == 2 || a == 3) {alert ('2,3'); }

Để giải pháp

Viết lại "nếu" thành "chuyển đổi" tầm quan trọng: 4 viết lại mã bên dưới bằng cách sử dụng một câu lệnh chuyển đổi duy nhất: Đặt A = +nhắc nhở ('A?', ''); if (a == alert (} if (a == alert (}

0) {0); 1) {1);

if (a == 2 || a == 3) {alert ('2,3'); }

Các chức năng khá thường xuyên, chúng ta cần thực hiện một hành động tương tự ở nhiều nơi của kịch bản. Ví dụ: chúng ta cần hiển thị một tin nhắn đẹp mắt khi khách truy cập đăng nhập, đăng xuất và có thể ở một nơi khác. Các chức năng là các khối xây dựng chính của chương trình. Chúng cho phép mã được gọi là nhiều lần mà không cần lặp lại. Chúng tôi đã thấy các ví dụ về các chức năng tích hợp, như cảnh báo (tin nhắn), nhắc nhở (tin nhắn, mặc định) và xác nhận (câu hỏi). Nhưng chúng ta cũng có thể tạo ra các chức năng của riêng mình.

Tuyên bố chức năng để tạo một chức năng Chúng ta có thể sử dụng khai báo chức năng.

Có vẻ như thế này:

hàm showMessage () {alert ('xin chào mọi người!'); }

Từ khóa chức năng đi trước, sau đó đi tên của hàm, sau đó là danh sách các tham số giữa các dấu ngoặc đơn (trống trong ví dụ trên) và cuối cùng là mã của hàm, cũng được đặt tên là cơ thể chức năng, giữa niềng răng xoăn.

Hàm mới của chúng tôi có thể được gọi bằng tên của nó: showMessage (). Ví dụ:

function showMessage () {let tin nhắn = "Xin chào, tôi là JavaScript!"; // cảnh báo biến cục bộ (tin nhắn); } tin chương trình(); // Xin chào, tôi là JavaScript! Thông điệp cảnh báo ); // biểu hiện

Điều này tạo ra một hàm chức năng có các đối số arg1..argn, đánh giá biểu thức ở phía bên phải với việc sử dụng của chúng và trả về kết quả của nó. Nói cách khác, nó gần giống như:

Đặt func = function (arg1, arg2, ... argn) {biểu thức return; };

Nhưng nhưng ngắn gọn hơn nhiều. Hãy để xem một ví dụ:

Đặt sum = (a, b) => a + b; /* Hàm mũi tên là một dạng ngắn hơn của: Đặt sum = hàm (a, b) {return a + b; }; */ cảnh báo (tổng (1, 2)); // 3

Nếu chúng ta chỉ có một đối số, thì dấu ngoặc đơn có thể được bỏ qua, làm cho điều đó thậm chí còn ngắn hơn:

// Tương tự như // Let double = function (n) {return n * 2} let double = n => n * 2; cảnh báo (gấp đôi (3)); // 6

Nếu không có đối số, dấu ngoặc đơn nên trống (nhưng chúng nên có mặt):

Hãy nói Sayhi = () => ALERT ("Xin chào!"); nói xin chào đi();

Arrow functions can be used in the same way as Function Expressions. For instance, here’s the rewritten example with welcome() : let age = prompt("What is your age?", 18); let welcome = (age < 18) ? () => alert('Hello') : () => alert("Greetings!"); welcome(); // ok now

Các chức năng mũi tên có thể xuất hiện không quen thuộc và lúc đầu không thể đọc được lắm, nhưng điều đó nhanh chóng thay đổi khi mắt quen với cấu trúc. Chúng rất thuận tiện cho các hành động một dòng đơn giản, khi chúng tôi quá lười biếng để viết nhiều từ.

Chức năng mũi tên đa dòng

Các ví dụ trên lấy các đối số từ bên trái => và đánh giá biểu thức phía bên phải với chúng. Đôi khi chúng ta cần một cái gì đó phức tạp hơn một chút, như nhiều biểu thức hoặc câu lệnh. Nó cũng có thể, nhưng chúng ta nên đặt chúng trong niềng răng xoăn. Sau đó sử dụng một lợi nhuận bình thường trong họ. Như thế này:

Đặt SUM = (A, B) => {// Nẹp xoăn mở hàm MultiLine Let Reversion = A + B; kết quả trả lại; // Nếu chúng ta sử dụng niềng răng xoăn, hãy sử dụng return để nhận kết quả}; cảnh báo (tổng (1, 2)); // 3

Chức năng mũi tên đa dòng

Các ví dụ trên lấy các đối số từ bên trái => và đánh giá biểu thức phía bên phải với chúng. Đôi khi chúng ta cần một cái gì đó phức tạp hơn một chút, như nhiều biểu thức hoặc câu lệnh. Nó cũng có thể, nhưng chúng ta nên đặt chúng trong niềng răng xoăn. Sau đó sử dụng một lợi nhuận bình thường trong họ. Như thế này:

Đặt SUM = (A, B) => {// Nẹp xoăn mở hàm MultiLine Let Reversion = A + B; kết quả trả lại; // Nếu chúng ta sử dụng niềng răng xoăn, hãy sử dụng return để nhận kết quả}; cảnh báo (tổng (1, 2)); // 3

Nhiều hơn nữa sẽ đến

Nhiều hơn nữa sẽ đến

Nhiều hơn nữa sẽ đến

Nhiều hơn nữa sẽ đến

Ở đây chúng tôi ca ngợi các chức năng mũi tên cho sự ngắn gọn. Nhưng đó không phải là tất cả! Các chức năng mũi tên có các tính năng thú vị khác. Chúng tôi sẽ quay lại với họ sau trong các chức năng mũi tên chương được xem xét lại. Hiện tại, chúng tôi đã có thể sử dụng chúng cho các hành động và gọi lại một dòng.

Tóm tắt ●

Nhiệm vụ viết lại với các hàm mũi tên Thay thế các biểu thức chức năng bằng các hàm mũi tên trong mã: Hàm hỏi (câu hỏi, có, không) {if (xác nhận (câu hỏi)) có () khác không (); } Hỏi ("Bạn có đồng ý không?"

Để giải pháp

JavaScript đặc biệt Chương này tóm tắt ngắn gọn các tính năng của JavaScript mà chúng tôi đã học được bây giờ, chú ý đặc biệt đến những khoảnh khắc tinh tế.

Các câu lệnh cấu trúc mã được phân định bằng dấu chấm phẩy:

cảnh báo ('xin chào'); cảnh báo ('thế giới');

Thông thường, một dòng phá vỡ cũng được coi là một dấu phân cách, vì vậy cũng sẽ hoạt động:

cảnh báo ('xin chào') cảnh báo ('thế giới')

Đó là người gọi là chèn chậu tự động. Đôi khi nó không hoạt động, ví dụ:

cảnh báo ("Sẽ có lỗi sau tin nhắn này") [1, 2] .foreach (ALERT)

Hầu hết các hướng dẫn Codestyle đều đồng ý rằng chúng ta nên đặt một dấu chấm phẩy sau mỗi câu lệnh. Không bắt buộc phải có dấu chấm phẩy sau khi các khối mã {...} và cú pháp xây dựng với chúng như các vòng lặp:

Hàm f () {// Không cần bán kết sau khi khai báo chức năng} for (;;) {// Không cần bán kết sau vòng lặp}

Tuy nhiên, ngay cả khi chúng ta có thể đặt một dấu chấm phẩy của người khác ở đâu đó, đó không phải là một lỗi. Nó sẽ bị bỏ qua. Thêm trong: Cấu trúc mã.

Chế độ nghiêm ngặt để kích hoạt hoàn toàn tất cả các tính năng của JavaScript hiện đại, chúng ta nên bắt đầu các tập lệnh với "sử dụng nghiêm ngặt". 'Sử dụng nghiêm ngặt'; ...

Chỉ thị phải ở đầu một tập lệnh hoặc khi bắt đầu một hàm. Không có "sử dụng nghiêm ngặt", mọi thứ vẫn hoạt động, nhưng một số tính năng hoạt động theo cách thời trang cũ, tương thích. Chúng tôi thường thích hành vi hiện đại. Một số tính năng hiện đại của ngôn ngữ (như các lớp mà chúng tôi sẽ nghiên cứu trong tương lai) cho phép chế độ nghiêm ngặt ngầm. Thêm vào: Chế độ hiện đại, "Sử dụng nghiêm ngặt".

Các biến có thể được khai báo bằng cách sử dụng: ●

để cho

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

var (kiểu cũ, sẽ xem sau)

Một tên biến có thể bao gồm: ●

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

var (kiểu cũ, sẽ xem sau)

Một tên biến có thể bao gồm: ●

Thư và chữ số, nhưng ký tự đầu tiên có thể không phải là một chữ số.

Ký tự $ và _ là bình thường, ngang bằng với các chữ cái.

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

const (hằng số, có thể thay đổi)

var (kiểu cũ, sẽ xem sau)

Một tên biến có thể bao gồm: ●

Thư và chữ số, nhưng ký tự đầu tiên có thể không phải là một chữ số.

Ký tự $ và _ là bình thường, ngang bằng với các chữ cái.

Bảng chữ cái không latin và chữ tượng hình cũng được cho phép, nhưng thường không được sử dụng.

Các biến được gõ động. Họ có thể lưu trữ bất kỳ giá trị nào:

Bảng chữ cái không latin và chữ tượng hình cũng được cho phép, nhưng thường không được sử dụng.

Các biến được gõ động. Họ có thể lưu trữ bất kỳ giá trị nào:

Bảng chữ cái không latin và chữ tượng hình cũng được cho phép, nhưng thường không được sử dụng.

Các biến được gõ động. Họ có thể lưu trữ bất kỳ giá trị nào:

Đặt x = 5; x = "John";

Có 7 loại dữ liệu: ●

số cho cả số dấu nổi và số nguyên,

Chuỗi cho chuỗi,

Boolean cho các giá trị logic: Đúng/Sai,

Bảng chữ cái không latin và chữ tượng hình cũng được cho phép, nhưng thường không được sử dụng.

Các biến được gõ động. Họ có thể lưu trữ bất kỳ giá trị nào:

Đặt x = 5; x = "John";

Có 7 loại dữ liệu: ●

Các so sánh khác chuyển đổi thành một số là tốt. Toán tử bình đẳng nghiêm ngặt === không thực hiện chuyển đổi: các loại khác nhau luôn có nghĩa là các giá trị khác nhau cho nó. Giá trị null và không xác định là đặc biệt: chúng bằng nhau == nhau và không bằng bất cứ điều gì khác. So sánh lớn hơn/ít hơn so sánh các chuỗi ký tự theo ký tự, các loại khác được chuyển đổi thành một số. Các nhà khai thác khác có rất ít người khác, như một nhà điều hành dấu phẩy. Thêm trong: toán tử, so sánh, toán tử logic.

Vòng lặp ●

Chúng tôi đã bao gồm 3 loại vòng lặp:

// 1 while (điều kiện) {...} // 2 do {...} while while (điều kiện); // 3 for (let i = 0; i <10; i ++) {...}

Biến được khai báo trong vòng lặp (LET ...) chỉ có thể nhìn thấy bên trong vòng lặp. Nhưng chúng ta cũng có thể bỏ qua LET và sử dụng lại một biến hiện có.

Chỉ thị phá vỡ/tiếp tục cho phép thoát toàn bộ vòng lặp/vòng lặp hiện tại. Sử dụng nhãn để phá vỡ các vòng lồng nhau.

Biến được khai báo trong vòng lặp (LET ...) chỉ có thể nhìn thấy bên trong vòng lặp. Nhưng chúng ta cũng có thể bỏ qua LET và sử dụng lại một biến hiện có.

Chỉ thị phá vỡ/tiếp tục cho phép thoát toàn bộ vòng lặp/vòng lặp hiện tại. Sử dụng nhãn để phá vỡ các vòng lồng nhau.

Chi tiết trong: Vòng lặp: Trong khi và cho. Sau đó, chúng tôi sẽ nghiên cứu thêm các loại vòng lặp để đối phó với các đối tượng.

Công tắc của người Viking, việc xây dựng cấu trúc của công tắc có thể thay thế nhiều kiểm tra nếu kiểm tra. Nó sử dụng === (Bình đẳng nghiêm ngặt) để so sánh. Ví dụ:

hãy để tuổi = nhắc nhở ('tuổi của bạn?', 18); chuyển đổi (tuổi) {trường hợp 18: cảnh báo ("sẽ không hoạt động"); // Kết quả của lời nhắc là một chuỗi, không phải là một trường hợp số "18": cảnh báo ("Điều này hoạt động!"); phá vỡ; Mặc định: cảnh báo ("bất kỳ giá trị nào không bằng một giá trị trên"); }

Chi tiết trong: Câu lệnh "chuyển đổi".

Các chức năng Chúng tôi bao gồm ba cách để tạo một hàm trong JavaScript: 1. Tuyên bố chức năng: Hàm trong luồng mã chính

hàm sum (a, b) {let result = a + b; kết quả trả lại; }

2. Biểu thức chức năng: Hàm trong ngữ cảnh của biểu thức

Đặt sum = hàm (a, b) {let result = a + b; kết quả trả lại; }

Biến được khai báo trong vòng lặp (LET ...) chỉ có thể nhìn thấy bên trong vòng lặp. Nhưng chúng ta cũng có thể bỏ qua LET và sử dụng lại một biến hiện có.

Chỉ thị phá vỡ/tiếp tục cho phép thoát toàn bộ vòng lặp/vòng lặp hiện tại. Sử dụng nhãn để phá vỡ các vòng lồng nhau.

Chi tiết trong: Vòng lặp: Trong khi và cho. Sau đó, chúng tôi sẽ nghiên cứu thêm các loại vòng lặp để đối phó với các đối tượng.

Công tắc của người Viking, việc xây dựng cấu trúc của công tắc có thể thay thế nhiều kiểm tra nếu kiểm tra. Nó sử dụng === (Bình đẳng nghiêm ngặt) để so sánh. Ví dụ:

hãy để tuổi = nhắc nhở ('tuổi của bạn?', 18); chuyển đổi (tuổi) {trường hợp 18: cảnh báo ("sẽ không hoạt động"); // Kết quả của lời nhắc là một chuỗi, không phải là một trường hợp số "18": cảnh báo ("Điều này hoạt động!"); phá vỡ; Mặc định: cảnh báo ("bất kỳ giá trị nào không bằng một giá trị trên"); }

Chi tiết trong: Câu lệnh "chuyển đổi".

Các chức năng Chúng tôi bao gồm ba cách để tạo một hàm trong JavaScript: 1. Tuyên bố chức năng: Hàm trong luồng mã chính

hàm sum (a, b) {let result = a + b; kết quả trả lại; }

2. Biểu thức chức năng: Hàm trong ngữ cảnh của biểu thức

Đặt sum = hàm (a, b) {let result = a + b; kết quả trả lại; }

Các biểu thức chức năng có thể có một tên, như sum = tên hàm (a, b), nhưng tên đó chỉ hiển thị bên trong hàm đó. 3. Hàm mũi tên:

// Biểu thức ở phía bên phải Đặt SUM = (A, B) => A + B; // hoặc cú pháp đa dòng với {...}, cần trả về tại đây: Đặt sum = (a, b) => {// ... trả về a + b; } // không có đối số hãy nói sayhi = () => cảnh báo ("xin chào"); // với một đối số duy nhất, hãy gấp đôi = n => n * 2;

Các chức năng có thể có các biến cục bộ: những chức năng được khai báo bên trong cơ thể của nó. Các biến như vậy chỉ có thể nhìn thấy bên trong hàm. Tham số có thể có các giá trị mặc định: Sum hàm (a = 1, b = 2) {...}. Các chức năng luôn trả về một cái gì đó. Nếu không có câu lệnh trả lại, thì kết quả không được xác định.

Biến được khai báo trong vòng lặp (LET ...) chỉ có thể nhìn thấy bên trong vòng lặp. Nhưng chúng ta cũng có thể bỏ qua LET và sử dụng lại một biến hiện có.

Biến được khai báo trong vòng lặp (LET ...) chỉ có thể nhìn thấy bên trong vòng lặp. Nhưng chúng ta cũng có thể bỏ qua LET và sử dụng lại một biến hiện có.

Chỉ thị phá vỡ/tiếp tục cho phép thoát toàn bộ vòng lặp/vòng lặp hiện tại. Sử dụng nhãn để phá vỡ các vòng lồng nhau.

Chi tiết trong: Vòng lặp: Trong khi và cho. Sau đó, chúng tôi sẽ nghiên cứu thêm các loại vòng lặp để đối phó với các đối tượng.

Công tắc của người Viking, việc xây dựng cấu trúc của công tắc có thể thay thế nhiều kiểm tra nếu kiểm tra. Nó sử dụng === (Bình đẳng nghiêm ngặt) để so sánh. Ví dụ:

hãy để tuổi = nhắc nhở ('tuổi của bạn?', 18); chuyển đổi (tuổi) {trường hợp 18: cảnh báo ("sẽ không hoạt động"); // Kết quả của lời nhắc là một chuỗi, không phải là một trường hợp số "18": cảnh báo ("Điều này hoạt động!"); phá vỡ; Mặc định: cảnh báo ("bất kỳ giá trị nào không bằng một giá trị trên"); }

Chi tiết trong: Câu lệnh "chuyển đổi".

Các chức năng Chúng tôi bao gồm ba cách để tạo một hàm trong JavaScript: 1. Tuyên bố chức năng: Hàm trong luồng mã chính

hàm sum (a, b) {let result = a + b; kết quả trả lại; }

2. Biểu thức chức năng: Hàm trong ngữ cảnh của biểu thức

Đặt sum = hàm (a, b) {let result = a + b; kết quả trả lại; }

Điểm dừng là một điểm của mã trong đó trình gỡ lỗi sẽ tự động tạm dừng việc thực thi JavaScript. Mặc dù mã bị tạm dừng, chúng ta có thể kiểm tra các biến hiện tại, thực thi các lệnh trong bảng điều khiển, v.v. Nói cách khác, chúng ta có thể gỡ lỗi nó. Chúng ta luôn có thể tìm thấy một danh sách các điểm dừng ở khung bên phải. Điều đó hữu ích khi chúng ta có nhiều điểm dừng trong các tệp khác nhau. Nó cho phép chúng ta: ●

Nhanh chóng nhảy đến điểm dừng trong mã (bằng cách nhấp vào nó vào khung bên phải).

Tạm thời vô hiệu hóa điểm dừng bằng cách bỏ chọn nó.

Tạm thời vô hiệu hóa điểm dừng bằng cách bỏ chọn nó.

Tạm thời vô hiệu hóa điểm dừng bằng cách bỏ chọn nó.

Xóa điểm dừng bằng cách nhấp chuột phải và chọn Xóa.

…Và như thế.

Điểm dừng có điều kiện

Nhấp chuột phải vào số dòng cho phép tạo điểm dừng có điều kiện. Nó chỉ kích hoạt khi biểu thức đã cho là sự thật. Điều đó tiện dụng khi chúng ta chỉ cần dừng lại cho một giá trị biến nhất định hoặc cho các tham số hàm nhất định.

Lệnh gỡ lỗi Chúng tôi cũng có thể tạm dừng mã bằng cách sử dụng lệnh gỡ lỗi, như thế này: function hello (name) {let clorre = `xin chào, $ {name}!`; trình gỡ lỗi;

// cảnh báo (user.name)); // Ann, John, Pete Users.Sort (Byfield ('Tuổi'))); user.foreach (user => alert (user.name)); // Pete, Ann, John

Để xây dựng

Quân đội chức năng

Hãy để kiểm tra những gì mà các thực hiện bên trong Makearmy, và giải pháp sẽ trở nên rõ ràng. 1. Nó tạo ra một game bắn súng mảng trống: hãy để game bắn súng = [];

2. Đổ đầy nó trong vòng lặp thông qua các game bắn súng.push (chức năng ...). Mỗi phần tử là một hàm, do đó, mảng kết quả trông như thế này: Shooters = Chức năng hàm hàm hàm hàm chức năng hàm chức năng hàm chức năng];

[() () () () () () () () () () ()

{{{{{{{{{{{

cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i); cảnh báo (i);

},},},},},},},},},}

3. Mảng được trả về từ hàm. Sau đó, sau đó, lời kêu gọi quân đội [5] () sẽ nhận được quân đội yếu tố [5] từ mảng (nó sẽ là một chức năng) và gọi nó là. Bây giờ tại sao tất cả các chức năng như vậy cho thấy giống nhau? Điều đó bởi vì ở đó, không có biến số địa phương I bên trong các chức năng của game bắn súng. Khi một chức năng như vậy được gọi, nó sẽ lấy tôi từ môi trường từ vựng bên ngoài của nó. Giá trị của tôi sẽ là gì? Nếu chúng ta nhìn vào nguồn: hàm makearmy () {... hãy để i = 0; while (i <10) {let shooter = function () {// cảnh báo chức năng bắn súng (i); // nên hiển thị số của nó}; ...} ...}

Chúng ta có thể thấy rằng nó sống trong môi trường từ vựng liên quan đến chạy makearmy () hiện tại. Nhưng khi Quân đội [5] () được gọi, Makearmy đã hoàn thành công việc của mình và tôi có giá trị cuối cùng: 10 (cuối cùng). Do đó, tất cả các chức năng của game bắn súng đều nhận được từ môi trường từ vựng bên ngoài giống nhau, giá trị cuối cùng I = 10. Chúng ta có thể sửa nó bằng cách di chuyển định nghĩa biến vào vòng lặp: function makearmy () {let game bắn súng = []; for (let i = 0; i <10; i ++) {let shooter = function () {// cảnh báo chức năng bắn súng (i); // nên hiển thị số của nó}; Các game bắn súng.push (game bắn súng); } Trở lại các game bắn súng; } hãy để quân đội = makearmy (); Quân đội [0] (); // 0 Quân đội [5] (); // 5

Bây giờ nó hoạt động chính xác, bởi vì mỗi khi mã chặn cho (hãy để i = 0 ...) {...} được thực thi, một môi trường từ vựng mới được tạo cho nó, với biến tương ứng i. Vì vậy, giá trị của tôi bây giờ sống gần hơn một chút. Không phải trong môi trường từ vựng makearmy (), mà trong môi trường từ vựng tương ứng với phép lặp vòng lặp hiện tại. Đó là lý do tại sao bây giờ nó hoạt động.

Ở đây chúng tôi viết lại trong khi vào cho. Một mẹo khác có thể có thể, hãy để Lừa xem nó để hiểu rõ hơn về chủ đề: hàm makearmy () {hãy để game bắn súng = [];

Đặt i = 0; while (i <10) {hãy để j = i; Đặt shooter = function () {// cảnh báo chức năng bắn súng (j); // nên hiển thị số của nó}; Các game bắn súng.push (game bắn súng); i ++; } Trở lại các game bắn súng; } hãy để quân đội = makearmy (); Quân đội [0] (); // 0 Quân đội [5] (); // 5

Lệnh gỡ lỗi Chúng tôi cũng có thể tạm dừng mã bằng cách sử dụng lệnh gỡ lỗi, như thế này: function hello (name) {let clorre = `xin chào, $ {name}!`; trình gỡ lỗi;

// cảnh báo (user.name)); // Ann, John, Pete Users.Sort (Byfield ('Tuổi'))); user.foreach (user => alert (user.name)); // Pete, Ann, John

Để xây dựng

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Xin lưu ý rằng chức năng tổng thực sự chỉ hoạt động một lần. Nó trả về chức năng f. Sau đó, trên mỗi cuộc gọi tiếp theo, F thêm tham số của nó vào các dòng tổng và tự trả về. Không có đệ quy trong dòng cuối cùng của f. Đây là những gì đệ quy trông giống như: hàm f (b) {currentsum += b; trả lại f (); // 100ms for (Đặt j = 0; j <100000000; j ++) {i ++; }

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Xin lưu ý rằng chức năng tổng thực sự chỉ hoạt động một lần. Nó trả về chức năng f. Sau đó, trên mỗi cuộc gọi tiếp theo, F thêm tham số của nó vào các dòng tổng và tự trả về. Không có đệ quy trong dòng cuối cùng của f. Đây là những gì đệ quy trông giống như: hàm f (b) {currentsum += b; trả lại f (); // 100ms for (Đặt j = 0; j <100000000; j ++) {i ++; }

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Xin lưu ý rằng chức năng tổng thực sự chỉ hoạt động một lần. Nó trả về chức năng f. Sau đó, trên mỗi cuộc gọi tiếp theo, F thêm tham số của nó vào các dòng tổng và tự trả về. Không có đệ quy trong dòng cuối cùng của f. Đây là những gì đệ quy trông giống như: hàm f (b) {currentsum += b; trả lại f (); // 100ms for (Đặt j = 0; j <100000000; j ++) {i ++; }

Người trang trí và chuyển tiếp, gọi/áp dụng Trình trang trí gián điệp ở đây chúng ta có thể sử dụng Calls.push (ARGS) để lưu trữ tất cả các đối số trong nhật ký và F.Apply (this, ARGS) để chuyển tiếp cuộc gọi. function Spy (func) {function wrapper (... args) {wrapper.calls.push (args); trả lại func.apply (cái này, lập luận); } bao bọc.calls = []; Trở lại trình bao bọc; }

Mở giải pháp với các bài kiểm tra trong hộp cát.

Trì hoãn bộ trang trí Giải pháp: Hàm chậm (f, ms) {return function () {setTimeout (() => f.Apply (this, argument), ms); }; } Đặt f1000 = trễ (cảnh báo, 1000);

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Xin lưu ý rằng chức năng tổng thực sự chỉ hoạt động một lần. Nó trả về chức năng f. Sau đó, trên mỗi cuộc gọi tiếp theo, F thêm tham số của nó vào các dòng tổng và tự trả về. Không có đệ quy trong dòng cuối cùng của f. Đây là những gì đệ quy trông giống như: hàm f (b) {currentsum += b; trả lại f (); // 100ms for (Đặt j = 0; j <100000000; j ++) {i ++; }

Để xây dựng

Tổng hợp với một lượng dấu ngoặc tùy ý 1. Đối với toàn bộ sự việc dù sao đi nữa, kết quả của tổng phải là chức năng. 2. Hàm đó phải giữ trong bộ nhớ giá trị hiện tại giữa các cuộc gọi. 3. Theo nhiệm vụ, hàm phải trở thành số khi được sử dụng trong ==. Các chức năng là các đối tượng, vì vậy việc chuyển đổi xảy ra như được mô tả trong đối tượng chương sang chuyển đổi nguyên thủy và chúng tôi có thể cung cấp phương pháp riêng của mình trả về số. Bây giờ mã: hàm sum (a) {let currentsum = a; hàm f (b) {dòng điện += b; trả lại f; } f.ToString = function () {return dòng điện; }; trả lại f; } cảnh báo (cảnh báo (cảnh báo (cảnh báo (cảnh báo (

tổng (1) (2)); // 3 tổng (5) (-1) (2)); // 6 tổng (6) (-1) (-2) (-3)); // 0 tổng (0) (1) (2) (3) (4) (5)); // 15

Thứ hai ràng buộc câu trả lời: John. hàm f () {alert (this.name); } f = f.bind ({name: "john"}) .bind ({name: "pete"}); f (); // John

Hàm giới hạn kỳ lạ  Đối tượng được trả về bởi F.Bind (...) nhớ lại bối cảnh (và các đối số nếu được cung cấp) tại thời điểm tạo. Một chức năng không thể được giới hạn lại.

Để xây dựng

Thuộc tính chức năng Sau khi ràng buộc Câu trả lời: Không xác định. Kết quả của ràng buộc là một đối tượng khác. Nó không có thuộc tính thử nghiệm. Để xây dựng

Khắc phục một chức năng mất "Điều này" Lỗi xảy ra do Ask có chức năng Đăng nhập/đăng nhập mà không có đối tượng. Khi nó gọi họ, họ tự nhiên cho rằng điều này = không xác định. Hãy để liên kết bối cảnh: Hàm askPassword (OK, fail) {let password = nhắc nhở ("mật khẩu?", ''); if (mật khẩu == "rockstar") ok (); khác thất bại (); } Let user = {name: 'john', loginok () {alert (`$ {this.name} đã đăng nhập trong`); }, logInfail () {alert (`$ {this.name} không đăng nhập vào`); },}; AskPassword (user.loginok.bind (người dùng), user.loginfail.bind (người dùng));

Bây giờ nó hoạt động. Một giải pháp thay thế có thể là: // ... AskPassword (() => user.loginok (), () => user.loginfail ());

Thông thường điều đó cũng hoạt động và có vẻ tốt. Nó ít đáng tin cậy hơn một chút mặc dù trong các tình huống phức tạp hơn, trong đó biến người dùng có thể thay đổi sau khi AskPassword được gọi, nhưng trước khi khách truy cập trả lời và gọi () =>

user.loginok (). Để xây dựng

Currying và một phần Ứng dụng một phần để đăng nhập 1. hoặc sử dụng hàm trình bao bọc, một mũi tên để súc tích: AskPassword (() => user.login (true), () => user.login (false));

Bây giờ nó có được người dùng từ các biến bên ngoài và chạy nó theo cách bình thường. 2. hoặc tạo hàm một phần từ user.login sử dụng người dùng làm ngữ cảnh và có đối số đầu tiên chính xác: AskPassword (user.login.bind (user, true), user.login.bind (user, false));

Để xây dựng

Thuộc tính chức năng Sau khi ràng buộc Câu trả lời: Không xác định. Kết quả của ràng buộc là một đối tượng khác. Nó không có thuộc tính thử nghiệm. Để xây dựng

Khắc phục một chức năng mất "Điều này" Lỗi xảy ra do Ask có chức năng Đăng nhập/đăng nhập mà không có đối tượng. Khi nó gọi họ, họ tự nhiên cho rằng điều này = không xác định. Hãy để liên kết bối cảnh: Hàm askPassword (OK, fail) {let password = nhắc nhở ("mật khẩu?", ''); if (mật khẩu == "rockstar") ok (); khác thất bại (); } Let user = {name: 'john', loginok () {alert (`$ {this.name} đã đăng nhập trong`); }, logInfail () {alert (`$ {this.name} không đăng nhập vào`); },}; AskPassword (user.loginok.bind (người dùng), user.loginfail.bind (người dùng));

Bây giờ nó hoạt động. Một giải pháp thay thế có thể là: // ... AskPassword (() => user.loginok (), () => user.loginfail ());

Thông thường điều đó cũng hoạt động và có vẻ tốt. Nó ít đáng tin cậy hơn một chút mặc dù trong các tình huống phức tạp hơn, trong đó biến người dùng có thể thay đổi sau khi AskPassword được gọi, nhưng trước khi khách truy cập trả lời và gọi () =>

user.loginok (). Để xây dựng

Currying và một phần Ứng dụng một phần để đăng nhập 1. hoặc sử dụng hàm trình bao bọc, một mũi tên để súc tích: AskPassword (() => user.login (true), () => user.login (false));

Bây giờ nó có được người dùng từ các biến bên ngoài và chạy nó theo cách bình thường. 2. hoặc tạo hàm một phần từ user.login sử dụng người dùng làm ngữ cảnh và có đối số đầu tiên chính xác: AskPassword (user.login.bind (user, true), user.login.bind (user, false));

Kế thừa nguyên mẫu làm việc với nguyên mẫu 1. Đúng, lấy từ thỏ. 2. null, lấy từ động vật. 3. Không xác định, không còn tài sản như vậy nữa. Để xây dựng

Thuật toán tìm kiếm 1. Hãy để thêm __proto__:

Là một giải pháp phổ biến, tất cả các thuộc tính mô tả trạng thái của một đối tượng cụ thể, như dạ dày ở trên, thường được viết vào đối tượng đó. Điều đó ngăn chặn những vấn đề như vậy. Để xây dựng

F.Prototype Thay đổi "Nguyên mẫu" Câu trả lời: 1. Đúng. Việc gán cho thỏ.prototype thiết lập [[nguyên mẫu]] cho các đối tượng mới, nhưng nó không ảnh hưởng đến các đối tượng hiện có. 2. Sai.

Các đối tượng được gán bằng tham chiếu. Đối tượng từ thỏ.prototype không được nhân đôi, nó vẫn là một đối tượng duy nhất được tham chiếu bởi cả thỏ.prototype và bởi [[nguyên mẫu]] của thỏ. Vì vậy, khi chúng tôi thay đổi nội dung của nó thông qua một tham chiếu, nó có thể nhìn thấy thông qua một tham chiếu khác. 3. Đúng. Tất cả các hoạt động xóa được áp dụng trực tiếp cho đối tượng. Ở đây xóa thỏ.eats cố gắng loại bỏ tài sản Eats khỏi thỏ, nhưng nó không có nó. Vì vậy, hoạt động giành chiến thắng có bất kỳ hiệu ứng. 4. Không xác định. Các tài sản ăn được xóa khỏi nguyên mẫu, nó không còn tồn tại nữa. Để xây dựng

Tạo một đối tượng có cùng một hàm tạo, chúng ta có thể sử dụng phương pháp đó nếu chúng ta chắc chắn rằng thuộc tính "Constructor" có giá trị chính xác. Chẳng hạn, nếu chúng ta không chạm vào "nguyên mẫu" mặc định, thì mã này hoạt động chắc chắn: người dùng chức năng (tên) {this.name = name; } hãy để người dùng = người dùng mới ('john'); Let user2 = new user.constructor ('pete'); cảnh báo (user2.name); // Pete (đã làm việc!)

Nó đã hoạt động, bởi vì user.prototype.constructor == user. Nhưng nếu ai đó, có thể nói, ghi đè lên người dùng. Ví dụ: người dùng chức năng (tên) {this.name = name; } User.prototype = {}; // (*)

Hãy để người dùng = người dùng mới ('John'); Let user2 = new user.constructor ('pete'); cảnh báo (user2.name); // chưa xác định

Tại sao user2.name không được xác định? Tại đây, cách thức mới của User.Constructor ('Pete') hoạt động: 1. Đầu tiên, nó tìm kiếm hàm tạo trong người dùng. Không. 2. Sau đó, nó theo chuỗi nguyên mẫu. Nguyên mẫu của người dùng là người dùng.prototype, và nó cũng không có gì. 3. Giá trị của user.prototype là một đối tượng trơn {}, nguyên mẫu của nó là Object.prototype. Và có Object.prototype.constructor == Object. Vì vậy, nó được sử dụng. Cuối cùng, chúng tôi đã cho User2 = New Object ('Pete'). Hàm tạo đối tượng tích hợp bỏ qua các đối số, nó luôn tạo ra một đối tượng trống-đó là những gì chúng ta có trong User2 sau tất cả. Để xây dựng

Các nguyên mẫu gốc Thêm phương thức "f.defer (ms)" vào các hàm function.prototype.defer = function (ms) {setTimeout (this, ms); }; hàm f () {alert ("Xin chào!"); } f.defer (1000); // Hiển thị "Xin chào!" Sau 1 giây

Để xây dựng

Thêm trang trí "trì hoãn ()" vào các hàm function.prototype.defer = function (ms) {let f = this; Trả về hàm (... args) {setTimeout (() => f.Apply (this, args), ms); }};

// kiểm tra chức năng nó f (a, b) {alert (a + b); } f.defer (1000) (1, 2); // hiển thị 3 sau 1 giây

Để xây dựng

Thêm trang trí "trì hoãn ()" vào các hàm function.prototype.defer = function (ms) {let f = this; Trả về hàm (... args) {setTimeout (() => f.Apply (this, args), ms); }};

// kiểm tra chức năng nó f (a, b) {alert (a + b); } f.defer (1000) (1, 2); // hiển thị 3 sau 1 giây

Các phương thức nguyên mẫu, các đối tượng không có __proto__ Thêm toString vào từ điển Phương thức có thể lấy tất cả các khóa có thể sử dụng bằng cách sử dụng đối tượng. Chất và xuất danh sách của chúng. Để tạo ra các thiết bị không thể kích thích, hãy để xác định nó bằng cách sử dụng bộ mô tả thuộc tính. Cú pháp của Object.Create cho phép chúng ta cung cấp một đối tượng với các mô tả thuộc tính làm đối số thứ hai. Đặt từ điển = object.create (null, {toString: {// xác định giá trị thuộc tính toString () {// Giá trị là một hàm trả về đối tượng.Keys (this) .join ();}}}); Từ điển.apple = "Apple"; Từ điển .__ proto__ = "kiểm tra"; // apple và __proto__ nằm trong vòng lặp (hãy đặt khóa trong từ điển) {alert (khóa); // "Apple", sau đó "__proto__"} // danh sách các thuộc tính được phân tách bằng dấu phẩy bằng cảnh báo toString (từ điển); // "Apple, __ Proto__"

Khi chúng tôi tạo một thuộc tính bằng cách sử dụng bộ mô tả, các cờ của nó là sai theo mặc định. Vì vậy, trong mã ở trên, từ điển.ToString là không thể kích hoạt. Xem các cờ thuộc tính Chương và mô tả để xem xét. Để xây dựng

Sự khác biệt giữa các cuộc gọi

Để xây dựng

Thêm trang trí "trì hoãn ()" vào các hàm function.prototype.defer = function (ms) {let f = this; Trả về hàm (... args) {setTimeout (() => f.Apply (this, args), ms); }};

Thỏ không xác định không xác định

start () {this.Render (); this.timer = setInterval (() => this.render (), 1000); }}

Đặt đồng hồ = đồng hồ mới ({mẫu: 'h: m: s'}); đồng hồ.start ();

Mở giải pháp trong hộp cát.

Để xây dựng

Lỗi kế thừa lớp tạo ra một thể hiện mà LỚN vì hàm tạo con phải gọi Super (). Ở đây, mã đã sửa: lớp động vật {constructor (tên) {this.name = name; }} lớp thỏ mở rộng động vật {constructor (name) {super (name); this.created = date.now (); }} Đặt thỏ = thỏ mới ("thỏ trắng"); // ok bây giờ cảnh báo (thỏ.name); // Thỏ trắng

Để xây dựng

Lỗi kế thừa lớp tạo ra một thể hiện mà LỚN vì hàm tạo con phải gọi Super (). Ở đây, mã đã sửa: lớp động vật {constructor (tên) {this.name = name; }} lớp thỏ mở rộng động vật {constructor (name) {super (name); this.created = date.now (); }} Đặt thỏ = thỏ mới ("thỏ trắng"); // ok bây giờ cảnh báo (thỏ.name); // Thỏ trắng

Lớp mở rộng lớp mở rộng mở rộng đồng hồ {trình xây dựng (tùy chọn) {super (tùy chọn); Đặt {Precision = 1000} = Tùy chọn; this.precision = độ chính xác;

Mở giải pháp trong hộp cát.

Để xây dựng

Lỗi kế thừa lớp tạo ra một thể hiện mà LỚN vì hàm tạo con phải gọi Super (). Ở đây, mã đã sửa: lớp động vật {constructor (tên) {this.name = name; }} lớp thỏ mở rộng động vật {constructor (name) {super (name); this.created = date.now (); }} Đặt thỏ = thỏ mới ("thỏ trắng"); // ok bây giờ cảnh báo (thỏ.name); // Thỏ trắng

Lớp mở rộng lớp mở rộng mở rộng đồng hồ {trình xây dựng (tùy chọn) {super (tùy chọn); Đặt {Precision = 1000} = Tùy chọn; this.precision = độ chính xác;

} start () {this.render (); this.timer = setInterval (() => this.Render (), this.precision); }};

Lớp mở rộng đối tượng? Đầu tiên, hãy để xem tại sao mã sau không hoạt động. Lý do trở nên rõ ràng nếu chúng ta cố gắng chạy nó. Một hàm tạo lớp kế thừa phải gọi Super (). Mặt khác, "điều này" đã giành được một số người được xác định. Vì vậy, ở đây, bản sửa lỗi: Lớp thỏ mở rộng đối tượng {constructor (name) {super (); // cần gọi hàm tạo cha mẹ khi kế thừa này.name = name; }} Đặt thỏ = Thỏ mới ("Rab"); cảnh báo (thỏ.hasownProperty ('tên')); // thật

Nhưng đó không phải là tất cả. Ngay cả sau khi sửa chữa, vẫn có sự khác biệt quan trọng trong "Thỏ lớp mở rộng đối tượng" so với thỏ lớp. Như chúng ta đã biết, cú pháp mở rộng của người Viking đã thiết lập hai nguyên mẫu: 1. Giữa "nguyên mẫu" của các hàm của hàm tạo (cho các phương thức). 2. Giữa các hàm xây dựng chính nó (đối với các phương thức tĩnh). Trong trường hợp của chúng tôi, đối với thỏ lớp mở rộng đối tượng, nó có nghĩa là: Lớp thỏ mở rộng đối tượng {} cảnh báo (thỏ.prototype .__ proto__ === object.prototype); // (1) cảnh báo thực sự (thỏ .__ proto__ === đối tượng); // (2) Đúng

Vì vậy, thỏ hiện cung cấp quyền truy cập vào các phương pháp tĩnh của đối tượng thông qua thỏ, như thế này:

Lớp Rabbit mở rộng đối tượng {} // Thông thường chúng ta gọi đối tượng.getOwnPropertyNames ALERT (Rabbit.getOwnPropertyNames ({A: 1, B: 2})); // a, b

Nhưng nếu chúng ta không thể mở rộng đối tượng, thì thỏ .__ proto__ sẽ không được đặt thành đối tượng. Ở đây, bản demo: Class Rabbit {} cảnh báo (Rabbit.prototype .__ Proto__ === Object.prototype); // (1) cảnh báo thực sự (thỏ .__ proto__ === đối tượng); // (2) sai (!) Cảnh báo (thỏ .__ proto__ === function.prototype); // Như bất kỳ chức năng nào theo mặc định // lỗi, không có chức năng như vậy trong cảnh báo thỏ (Rabbit.getOwnPropertyNames ({a: 1, b: 2})); // Lỗi

Vì vậy, Rabbit không cung cấp quyền truy cập vào các phương thức tĩnh của đối tượng trong trường hợp đó. Nhân tiện, Function.prototype có các phương thức chức năng chung, như cuộc gọi, liên kết, v.v ... cuối cùng chúng có sẵn trong cả hai trường hợp, bởi vì đối với hàm tạo đối tượng tích hợp, đối tượng .__ proto__ === function.prototype. Ở đây, hình ảnh:

Vì vậy, để đặt nó ngắn, có hai sự khác biệt: Thỏ lớp

Lớp thỏ mở rộng đối tượng

Để xây dựng

Lỗi kế thừa lớp tạo ra một thể hiện mà LỚN vì hàm tạo con phải gọi Super (). Ở đây, mã đã sửa: lớp động vật {constructor (tên) {this.name = name; }} lớp thỏ mở rộng động vật {constructor (name) {super (name); this.created = date.now (); }} Đặt thỏ = thỏ mới ("thỏ trắng"); // ok bây giờ cảnh báo (thỏ.name); // Thỏ trắng

Lớp mở rộng lớp mở rộng mở rộng đồng hồ {trình xây dựng (tùy chọn) {super (tùy chọn); Đặt {Precision = 1000} = Tùy chọn; this.precision = độ chính xác;

} start () {this.render (); this.timer = setInterval (() => this.Render (), this.precision); }};

Lớp mở rộng đối tượng? Đầu tiên, hãy để xem tại sao mã sau không hoạt động. Lý do trở nên rõ ràng nếu chúng ta cố gắng chạy nó. Một hàm tạo lớp kế thừa phải gọi Super (). Mặt khác, "điều này" đã giành được một số người được xác định. Vì vậy, ở đây, bản sửa lỗi: Lớp thỏ mở rộng đối tượng {constructor (name) {super (); // cần gọi hàm tạo cha mẹ khi kế thừa này.name = name; }} Đặt thỏ = Thỏ mới ("Rab"); cảnh báo (thỏ.hasownProperty ('tên')); // thật

Nhưng đó không phải là tất cả. Ngay cả sau khi sửa chữa, vẫn có sự khác biệt quan trọng trong "Thỏ lớp mở rộng đối tượng" so với thỏ lớp. Như chúng ta đã biết, cú pháp mở rộng của người Viking đã thiết lập hai nguyên mẫu: 1. Giữa "nguyên mẫu" của các hàm của hàm tạo (cho các phương thức). 2. Giữa các hàm xây dựng chính nó (đối với các phương thức tĩnh). Trong trường hợp của chúng tôi, đối với thỏ lớp mở rộng đối tượng, nó có nghĩa là: Lớp thỏ mở rộng đối tượng {} cảnh báo (thỏ.prototype .__ proto__ === object.prototype); // (1) cảnh báo thực sự (thỏ .__ proto__ === đối tượng); // (2) Đúng

Vì vậy, thỏ hiện cung cấp quyền truy cập vào các phương pháp tĩnh của đối tượng thông qua thỏ, như thế này:

Lớp Rabbit mở rộng đối tượng {} // Thông thường chúng ta gọi đối tượng.getOwnPropertyNames ALERT (Rabbit.getOwnPropertyNames ({A: 1, B: 2})); // a, b

Để xây dựng

Giới thiệu: Callbacks Animated Circle với Callback Mở giải pháp trong hộp cát. Để xây dựng

Lời hứa sẽ giải quyết lại một lời hứa? Đầu ra là: 1. Cuộc gọi thứ hai để giải quyết bị bỏ qua, bởi vì chỉ có cuộc gọi từ chối/giải quyết đầu tiên được tính đến. Các cuộc gọi tiếp theo bị bỏ qua. Để xây dựng

Độ trễ với hàm trễ hứa hẹn (ms) {return New Promise (resolve => setTimeout (resolve, ms)); } trễ (3000) .then (() => alert ('chạy sau 3 giây'));

Xin lưu ý rằng trong giải quyết nhiệm vụ này được gọi mà không có đối số. Chúng tôi không trả lại bất kỳ giá trị nào từ độ trễ, chỉ cần đảm bảo sự chậm trễ. Để xây dựng

Vòng tròn hoạt hình với Promise Mở giải pháp trong hộp cát.

Để xây dựng

Lời hứa sẽ giải quyết lại một lời hứa? Đầu ra là: 1. Cuộc gọi thứ hai để giải quyết bị bỏ qua, bởi vì chỉ có cuộc gọi từ chối/giải quyết đầu tiên được tính đến. Các cuộc gọi tiếp theo bị bỏ qua. Để xây dựng

Độ trễ với hàm trễ hứa hẹn (ms) {return New Promise (resolve => setTimeout (resolve, ms)); } trễ (3000) .then (() => alert ('chạy sau 3 giây'));

Xin lưu ý rằng trong giải quyết nhiệm vụ này được gọi mà không có đối số. Chúng tôi không trả lại bất kỳ giá trị nào từ độ trễ, chỉ cần đảm bảo sự chậm trễ. Để xây dựng

Vòng tròn hoạt hình với Promise Mở giải pháp trong hộp cát.

Lời hứa hứa hẹn với lời hứa: Sau đó, so với việc bắt câu trả lời ngắn là: Không, chúng không bằng nhau: sự khác biệt là nếu lỗi xảy ra trong F1, thì nó được xử lý bởi .Catch ở đây: Promise. );

… Nhưng không phải ở đây:

lời hứa .then (f1, f2);

Điều đó bởi vì một lỗi được truyền lại trong chuỗi, và trong đoạn mã thứ hai, không có chuỗi nào dưới F1. Nói cách khác,. Sau đó chuyển kết quả/lỗi cho. Sau đó/bắt. Vì vậy, trong ví dụ đầu tiên, có một cú bắt dưới đây, và trong lần thứ hai - có một số người, vì vậy lỗi không được xử lý. Để xây dựng

Xử lý lỗi với lời hứa lỗi trong setTimeout Câu trả lời là: Không, nó sẽ không: Lời hứa mới (hàm (giải quyết, từ chối) {setTimeout (() => {ném lỗi mới ("whiros!");}, 1000); }). Bắt (cảnh báo);

Như đã nói trong chương, có một "thử tiềm ẩn..catch" xung quanh mã chức năng. Vì vậy, tất cả các lỗi đồng bộ được xử lý. Nhưng ở đây lỗi được tạo ra không phải trong khi người thực thi đang chạy, mà là sau đó. Vì vậy, lời hứa có thể xử lý nó. Để xây dựng

Async/đang chờ viết lại bằng async/chờ đợi các ghi chú nằm dưới mã: hàm async loadJSON (url) {// (1) let respends = await fetch (url); // (2) if (respons.status == 200) {hãy để json = chờ phản hồi.json (); // (3) trả lại json; }

ném lỗi mới (phản hồi.status); } loadJson ('No-such-user.json') .catch (alert); // Lỗi: 404 (4)

Ghi chú: 1. Hàm LoadJson trở thành Async. 2. Tất cả. Bên trong được thay thế bằng chờ đợi. 3. Chúng ta có thể trả về phản hồi.json () thay vì chờ đợi nó, như thế này: if (reserves.status == 200) {return return.json (); // (3)}

Để xây dựng

Sau đó, mã bên ngoài sẽ phải chờ đợi lời hứa đó để giải quyết. Trong trường hợp của chúng tôi, nó không quan trọng. 4. Lỗi được ném từ Loadjson được xử lý bởi .catch. Chúng tôi có thể sử dụng Await Loadjson (Mạnh) ở đó, bởi vì chúng tôi không ở trong một chức năng không đồng bộ. Để xây dựng

Để xây dựng

Viết lại "rethrow" với async/chờ đợi không có thủ thuật nào ở đây. Chỉ cần thay thế. this.name = 'httperror'; this.response = phản hồi; }} hàm async loadJSON (url) {let respession = isait fetch (url); if (respons.status == 200) {return respession.json ();

} other {ném httperror mới (phản hồi); }} // yêu cầu tên người dùng cho đến khi github trả về một người dùng hợp lệ Async hàm demogithubuser () {hãy để người dùng; while (true) {let name = nhắc nhở ("nhập tên?", "iliakan"); thử {user = Await LoadJson (`https://api.github.com/users/$ {name}`); phá vỡ; // Không có lỗi, LOOP thoát} Catch (err) {if (err instanceOf httperror && err.response.status == 404) {// loop tiếp tục sau cảnh báo cảnh báo ("Không người dùng như vậy, vui lòng nhập lại."); } other {// lỗi không xác định, rethrow ném err; }}}

cảnh báo (`tên đầy đủ: $ {user.name} .`); trả về người dùng; } demogithubuser ();

Proxy và phản ánh lỗi khi đọc thuộc tính không tồn tại

Hãy để người dùng = {name: "John"}; Function Wrap (Target) {trả về proxy mới (Target, {get (target, prop, người nhận) {if (prop in target) {return respl không tồn tại: "$ {prop}" `)}}}); } user = wrap (người dùng); cảnh báo (user.name); // John Alert (người dùng.age); // Lỗi: thuộc tính không tồn tại

Để xây dựng

Truy cập mảng [-1] Let mảng = [1, 2, 3]; Array = new proxy (mảng, {get (target, prop, người nhận) {if (prop <0) {// ngay cả khi chúng ta truy cập nó như mảng [1] // prop là một chuỗi prop = + prop + target.length;} return return resplect.get (Target, prop, người nhận);}});

cảnh báo (mảng [-1]); // 3 cảnh báo (mảng [-2]); // 2

Để xây dựng

Truy cập mảng [-1] Let mảng = [1, 2, 3]; Array = new proxy (mảng, {get (target, prop, người nhận) {if (prop <0) {// ngay cả khi chúng ta truy cập nó như mảng [1] // prop là một chuỗi prop = + prop + target.length;} return return resplect.get (Target, prop, người nhận);}});

cảnh báo (mảng [-1]); // 3 cảnh báo (mảng [-2]); // 2

Để xây dựng

Truy cập mảng [-1] Let mảng = [1, 2, 3]; Array = new proxy (mảng, {get (target, prop, người nhận) {if (prop <0) {// ngay cả khi chúng ta truy cập nó như mảng [1] // prop là một chuỗi prop = + prop + target.length;} return return resplect.get (Target, prop, người nhận);}});

cảnh báo (mảng [-1]); // 3 cảnh báo (mảng [-2]); // 2

Để xây dựng

Truy cập mảng [-1] Let mảng = [1, 2, 3]; Array = new proxy (mảng, {get (target, prop, người nhận) {if (prop <0) {// ngay cả khi chúng ta truy cập nó như mảng [1] // prop là một chuỗi prop = + prop + target.length;} return return resplect.get (Target, prop, người nhận);}});

cảnh báo (mảng [-1]); // 3 cảnh báo (mảng [-2]); // 2

Có thể quan sát được giải pháp bao gồm hai phần: 1. Bất cứ khi nào .Observe (người xử lý) được gọi, chúng ta cần nhớ người xử lý ở đâu đó, để có thể gọi nó sau. Chúng ta có thể lưu trữ nó ngay trong đối tượng, sử dụng biểu tượng của chúng ta làm khóa. 2. Chúng tôi cần một proxy với bẫy được đặt để gọi trình xử lý trong trường hợp có bất kỳ thay đổi nào.

hãy để người xử lý = ký hiệu ('người xử lý'); hàm makeObServable (Target) {// 1. Khởi tạo Trình xử lý mục tiêu lưu trữ [người xử lý] = []; // Lưu trữ hàm xử lý trong mảng cho các cuộc gọi trong tương lai Target.Observe = function (Handler) {Điều này [Trình xử lý] .push (Handler); }; // 2. Tạo proxy để xử lý các thay đổi trả về proxy mới (Target, {set (Target, Thuộc tính, Giá trị, Trình nhận) thành công) {// nếu không có lỗi trong khi đặt thuộc tính // gọi tất cả các trình xử lý mục tiêu [Trình xử lý] .foreach (Handler => Handler (Thuộc tính, Giá trị));} Trả về Thành công;}}); } hãy để người dùng = {}; user = makeObServable (người dùng); user.observe ((key, value) => {alert (`set $ {key} = $ {value}`);}); user.name = "John";

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Eval: Chạy chuỗi mã Eval-calculator cho phép sử dụng Eval để tính toán biểu thức toán học: Let expr = prompt ("Nhập biểu thức số học?", '2*3+2'); cảnh báo (eval (expr));

Người dùng có thể nhập bất kỳ văn bản hoặc mã nào mặc dù. Để làm cho mọi thứ an toàn và chỉ giới hạn nó ở Arithmetics, chúng ta có thể kiểm tra expr bằng cách sử dụng biểu thức thông thường, để nó chỉ có thể chứa các chữ số và toán tử.

Phần 2

Trình duyệt: tài liệu, sự kiện, giao diện

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại https://javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

hàm Sayhi () {alert ("xin chào");

} // Các hàm toàn cầu có thể truy cập dưới dạng thuộc tính của Window Window.sayhi ();

Và ở đây chúng tôi sử dụng nó như một cửa sổ trình duyệt, để xem chiều cao cửa sổ:

cảnh báo (window.innerheight); // Chiều cao cửa sổ bên trong

Có nhiều phương pháp và thuộc tính dành riêng cho cửa sổ, chúng tôi sẽ bao gồm chúng sau.

DOM (Mô hình đối tượng tài liệu) Đối tượng tài liệu cho phép truy cập vào nội dung trang. Chúng ta có thể thay đổi hoặc tạo bất cứ thứ gì trên trang bằng cách sử dụng nó. Ví dụ:

// Thay đổi màu nền thành tài liệu màu đỏ.body.style.background = "màu đỏ"; // Thay đổi nó trở lại sau 1 giây setTimeout (() => document.body.style.background = "", 1000);

Ở đây chúng tôi đã sử dụng document.body.style, nhưng có rất nhiều, nhiều hơn nữa. Các thuộc tính và phương thức được mô tả trong đặc điểm kỹ thuật: ●

Tiêu chuẩn sống của Dom tại https://dom.spec.whatwg.org

DOM không chỉ dành cho trình duyệt

Thông số kỹ thuật DOM giải thích cấu trúc của một tài liệu và cung cấp các đối tượng để thao tác nó. Có những dụng cụ không phải là các công cụ sử dụng nó quá. Chẳng hạn, các công cụ phía máy chủ tải xuống các trang HTML và xử lý chúng sử dụng DOM. Họ có thể chỉ hỗ trợ một phần của đặc điểm kỹ thuật mặc dù.

DOM không chỉ dành cho trình duyệt

Thông số kỹ thuật DOM giải thích cấu trúc của một tài liệu và cung cấp các đối tượng để thao tác nó. Có những dụng cụ không phải là các công cụ sử dụng nó quá. Chẳng hạn, các công cụ phía máy chủ tải xuống các trang HTML và xử lý chúng sử dụng DOM. Họ có thể chỉ hỗ trợ một phần của đặc điểm kỹ thuật mặc dù.

CSSOM cho kiểu dáng

Các quy tắc và kiểu dáng CSS không được cấu trúc như HTML. Có một đặc điểm kỹ thuật riêng biệt CSSOM giải thích cách chúng được biểu diễn dưới dạng đối tượng và cách đọc và viết chúng. CSSOM được sử dụng cùng với DOM khi chúng tôi sửa đổi các quy tắc kiểu cho tài liệu. Trong thực tế, CSSOM hiếm khi được yêu cầu, bởi vì thông thường các quy tắc CSS là tĩnh. Chúng tôi hiếm khi cần thêm/loại bỏ các quy tắc CSS khỏi JavaScript, vì vậy chúng tôi đã giành chiến thắng ngay bây giờ.

BOM (Mô hình đối tượng Trình duyệt) Mô hình đối tượng Trình duyệt (BOM) là các đối tượng bổ sung được cung cấp bởi trình duyệt (môi trường máy chủ) để hoạt động với mọi thứ ngoại trừ tài liệu. Ví dụ: ●

DOM không chỉ dành cho trình duyệt

Thông số kỹ thuật DOM giải thích cấu trúc của một tài liệu và cung cấp các đối tượng để thao tác nó. Có những dụng cụ không phải là các công cụ sử dụng nó quá. Chẳng hạn, các công cụ phía máy chủ tải xuống các trang HTML và xử lý chúng sử dụng DOM. Họ có thể chỉ hỗ trợ một phần của đặc điểm kỹ thuật mặc dù.

CSSOM cho kiểu dáng

Các quy tắc và kiểu dáng CSS không được cấu trúc như HTML. Có một đặc điểm kỹ thuật riêng biệt CSSOM giải thích cách chúng được biểu diễn dưới dạng đối tượng và cách đọc và viết chúng. CSSOM được sử dụng cùng với DOM khi chúng tôi sửa đổi các quy tắc kiểu cho tài liệu. Trong thực tế, CSSOM hiếm khi được yêu cầu, bởi vì thông thường các quy tắc CSS là tĩnh. Chúng tôi hiếm khi cần thêm/loại bỏ các quy tắc CSS khỏi JavaScript, vì vậy chúng tôi đã giành chiến thắng ngay bây giờ.

BOM (Mô hình đối tượng Trình duyệt) Mô hình đối tượng Trình duyệt (BOM) là các đối tượng bổ sung được cung cấp bởi trình duyệt (môi trường máy chủ) để hoạt động với mọi thứ ngoại trừ tài liệu. Ví dụ: ●

Ví dụ, một ví dụ về DOM, hãy để khám phá DOM cho tài liệu này:

Về Elks

Sự thật về Elks.

DOM đại diện cho HTML như một cấu trúc cây của các thẻ. Ở đây, nó trông như thế nào: ▾ html ▾ Head #Text ␣␣␣␣

▾ Tiêu đề #Text về Elks #Text ␣␣ #Text ␣␣

Cơ thể #Text Sự thật về Elks.

Thẻ được gọi là các nút phần tử (hoặc chỉ các phần tử). Thẻ lồng nhau trở thành trẻ em của những người kèm theo. Kết quả là chúng ta có một cây nguyên tố: là gốc, sau đó và là con cái của nó, v.v ... Văn bản bên trong các phần tử tạo thành các nút văn bản, được dán nhãn là #Text. Một nút văn bản chỉ chứa một chuỗi. Nó có thể không có con và luôn là một chiếc lá của cây. Chẳng hạn, thẻ có văn bản "Giới thiệu".

Xin lưu ý các ký tự đặc biệt trong các nút văn bản: ●

Một dòng mới: ↵ (trong JavaScript được gọi là \ n)

một không gian: ␣

Spaces và Newlines - là các ký tự hoàn toàn hợp lệ, chúng tạo thành các nút văn bản và trở thành một phần của DOM. Vì vậy, ví dụ, trong ví dụ trên thẻ chứa một số khoảng trống trước đó và văn bản đó trở thành nút #Text (nó chỉ chứa một dòng mới và một số không gian). Chỉ có hai loại trừ cấp cao nhất: 1. Không gian và dòng mới trước đây bị bỏ qua vì lý do lịch sử, 2. Nếu chúng ta đặt một cái gì đó sau đó, thì điều đó sẽ tự động di chuyển bên trong cơ thể Phải ở bên trong. Vì vậy, có thể không có không gian sau. Trong các trường hợp khác, mọi thứ đều đơn giản - nếu có không gian (giống như bất kỳ ký tự nào) trong tài liệu, thì chúng trở thành nút văn bản trong DOM và nếu chúng ta xóa chúng, thì sẽ giành được bất kỳ. Dưới đây không có nút văn bản chỉ có không gian:

Về sự thật về Elks. elem.style.backgroundcolor z-index => elem.style.zindex biên giới-left-width => elem.style.borderleftwidth

Ví dụ:

document.body.style.backgroundColor = prompt ('màu nền?', 'màu xanh lá cây');

Thuộc tính tiền tố

Các thuộc tính có trình duyệt như -moz-Border-Radius, -webkitbandder-Radius cũng tuân theo quy tắc tương tự, ví dụ: bettyle.style.mozbeterradius = '5px'; nút.style.webkitborderradius = '5px';

Đó là: một dấu gạch ngang "-" trở thành một chữ hoa.

Đặt lại thuộc tính kiểu đôi khi chúng tôi muốn gán một thuộc tính kiểu, và sau đó xóa nó. Chẳng hạn, để ẩn một phần tử, chúng ta có thể đặt elem.style.display = "none".

Sau đó, chúng ta có thể muốn loại bỏ style.display như thể nó không được đặt. Thay vì xóa elem.style.display, chúng ta nên gán một chuỗi trống cho nó: elem.style.display = "". // Nếu chúng tôi chạy mã này, tài liệu "nhấp nháy ".body.style.display =" none "; // Ẩn setTimeout (() => document.body.style.display = "", 1000); // trở lại bình thường

Nếu chúng tôi đặt hiển thị thành một chuỗi trống, thì trình duyệt áp dụng các lớp CSS và các kiểu tích hợp của nó một cách thông thường, như thể không có thuộc tính hiển thị như vậy.

Thuộc tính tiền tố

Các thuộc tính có trình duyệt như -moz-Border-Radius, -webkitbandder-Radius cũng tuân theo quy tắc tương tự, ví dụ: bettyle.style.mozbeterradius = '5px'; nút.style.webkitborderradius = '5px';

Đó là: một dấu gạch ngang "-" trở thành một chữ hoa.

Đặt lại thuộc tính kiểu đôi khi chúng tôi muốn gán một thuộc tính kiểu, và sau đó xóa nó. Chẳng hạn, để ẩn một phần tử, chúng ta có thể đặt elem.style.display = "none".

Sau đó, chúng ta có thể muốn loại bỏ style.display như thể nó không được đặt. Thay vì xóa elem.style.display, chúng ta nên gán một chuỗi trống cho nó: elem.style.display = "". // Nếu chúng tôi chạy mã này, tài liệu "nhấp nháy ".body.style.display =" none "; // Ẩn setTimeout (() => document.body.style.display = "", 1000); // trở lại bình thường

Nếu chúng tôi đặt hiển thị thành một chuỗi trống, thì trình duyệt áp dụng các lớp CSS và các kiểu tích hợp của nó một cách thông thường, như thể không có thuộc tính hiển thị như vậy.

Viết lại đầy đủ với style.csstext

Thông thường, chúng tôi sử dụng phong cách.* Để gán các thuộc tính kiểu riêng lẻ. Chúng ta có thể thiết lập phong cách đầy đủ như div.style = "color: red; width: 100px", vì div.style là một đối tượng và nó chỉ đọc. Để đặt phong cách đầy đủ thành một chuỗi, có một kiểu thuộc tính đặc biệt.csstext: nút

Thuộc tính này hiếm khi được sử dụng, bởi vì bài tập như vậy sẽ loại bỏ tất cả các kiểu hiện có: nó không thêm, nhưng thay thế chúng. Đôi khi có thể xóa một cái gì đó cần thiết. Nhưng chúng ta có thể sử dụng nó một cách an toàn cho các yếu tố mới, khi chúng ta biết rằng chúng ta đã thắng xóa một phong cách hiện có. Điều tương tự có thể được thực hiện bằng cách đặt một thuộc tính: Div.SetAttribution ('Style', 'Color: Red ...').

Tâm trí các đơn vị

Các đơn vị CSS phải được cung cấp trong các giá trị kiểu. Chẳng hạn, chúng ta không nên đặt elem.style.top thành 10, mà là 10px. Nếu không thì nó sẽ hoạt động:

Được tính toán và giải quyết các giá trị

Có hai khái niệm trong CSS

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

GetComputedStyle yêu cầu tên toàn bộ

Chúng ta phải luôn luôn yêu cầu tài sản chính xác mà chúng ta muốn, như paddingleft hoặc margintop hoặc biên giới. Nếu không thì kết quả chính xác không được đảm bảo. Chẳng hạn, nếu có các thuộc tính paddingleft/paddingtop, thì chúng ta nên nhận gì cho getComputedStyle (ELEM) .padding? Không có gì, hoặc có thể là một giá trị được tạo ra trên mạng từ các mái chèo đã biết? Không có quy tắc tiêu chuẩn ở đây. Có những mâu thuẫn khác. Ví dụ, một số trình duyệt (Chrome) hiển thị 10px trong tài liệu bên dưới và một số trong số chúng (Firefox) - không:

Các phong cách liên kết đã truy cập vào các liên kết được ẩn!

Các liên kết được truy cập có thể được tô màu bằng cách sử dụng: Visit CSS Pseudoclass. Nhưng GetComputedStyle không cung cấp quyền truy cập vào màu đó, bởi vì nếu không, một trang tùy ý có thể tìm hiểu xem người dùng có truy cập liên kết hay không bằng cách tạo nó trên trang và kiểm tra các kiểu. JavaScript có thể không thấy các kiểu được áp dụng bởi: đã truy cập. Ngoài ra, có một giới hạn trong CSS cấm áp dụng các kiểu thay đổi hình học trong: đã truy cập. Điều đó để đảm bảo rằng không có trang nào cho một trang xấu xa để kiểm tra xem một liên kết đã được truy cập và do đó phá vỡ sự riêng tư.

Tóm tắt Để quản lý các lớp, có hai thuộc tính DOM: ●

ClassName - Giá trị chuỗi, tốt để quản lý toàn bộ tập hợp các lớp. Danh sách lớp - đối tượng có các phương thức Thêm/Xóa/Chuyển đổi/Chứa, Tốt cho các lớp riêng lẻ.

Để thay đổi các kiểu: ●

ClassName - Giá trị chuỗi, tốt để quản lý toàn bộ tập hợp các lớp. Danh sách lớp - đối tượng có các phương thức Thêm/Xóa/Chuyển đổi/Chứa, Tốt cho các lớp riêng lẻ.

Để thay đổi các kiểu: ●

Thuộc tính phong cách là một đối tượng với các kiểu Camelcased. Đọc và viết cho nó có ý nghĩa tương tự như sửa đổi các thuộc tính riêng lẻ trong thuộc tính "kiểu". Để xem cách áp dụng những thứ quan trọng và các thứ hiếm khác - có một danh sách các phương thức tại MDN. Thuộc tính style.csStext tương ứng với toàn bộ thuộc tính "kiểu", chuỗi đầy đủ của các kiểu.

Để đọc các kiểu đã được giải quyết (liên quan đến tất cả các lớp, sau khi tất cả các CS được áp dụng và các giá trị cuối cùng được tính toán): ●

GetComputedStyle (elem [, giả]) trả về đối tượng giống như kiểu dáng với chúng. Chỉ đọc.

Nhiệm vụ tạo ra một tầm quan trọng thông báo: 5 Viết chức năng hiển thị (Tùy chọn) tạo ra một thông báo: với nội dung đã cho. Thông báo

:

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

GetComputedStyle yêu cầu tên toàn bộ

Chúng ta phải luôn luôn yêu cầu tài sản chính xác mà chúng ta muốn, như paddingleft hoặc margintop hoặc biên giới. Nếu không thì kết quả chính xác không được đảm bảo. Chẳng hạn, nếu có các thuộc tính paddingleft/paddingtop, thì chúng ta nên nhận gì cho getComputedStyle (ELEM) .padding? Không có gì, hoặc có thể là một giá trị được tạo ra trên mạng từ các mái chèo đã biết? Không có quy tắc tiêu chuẩn ở đây. Có những mâu thuẫn khác. Ví dụ, một số trình duyệt (Chrome) hiển thị 10px trong tài liệu bên dưới và một số trong số chúng (Firefox) - không:

Các phong cách liên kết đã truy cập vào các liên kết được ẩn!

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

Khu vực đáy đệm có thể chứa đầy văn bản

Thông thường các mái chèo được hiển thị trống trên các hình minh họa, nhưng nếu có rất nhiều văn bản trong phần tử và nó tràn, thì các trình duyệt hiển thị văn bản tràn ra trên các phần dưới đáy. Đó là một lưu ý để tránh sự nhầm lẫn, vì đáy đệm được đặt trong các ví dụ khác, trừ khi có quy định rõ ràng khác.

Hình học ở đây, hình ảnh tổng thể:

Các giá trị của các thuộc tính này là các số kỹ thuật, nhưng những con số này là của các pixel, vì vậy đây là các phép đo pixel. Chúng là nhiều tính chất, rất khó để phù hợp với tất cả chúng trong một bức tranh duy nhất, nhưng giá trị của chúng rất đơn giản và dễ hiểu.

Hãy bắt đầu khám phá chúng từ bên ngoài yếu tố.

offsetparent, offsetleft/top Các thuộc tính này hiếm khi cần thiết, nhưng chúng vẫn là các thuộc tính hình học bên ngoài nhất, vì vậy chúng tôi sẽ bắt đầu với chúng. Tùy bù là tổ tiên gần nhất, trình duyệt sử dụng để tính toán tọa độ trong quá trình kết xuất. Đó là tổ tiên gần nhất, thỏa mãn các điều kiện sau: 1. vị trí của CSS (vị trí là tuyệt đối, tương đối, cố định hoặc dính), 2. hoặc

,,, 3. Hoặc. Các thuộc tính offsetleft/offsetTop cung cấp tọa độ x/y so với góc trên bên trái của nó. Trong ví dụ bên dưới bên trong có sự thay đổi và offsetleft/offsettop chuyển từ góc trên bên trái của nó (180):

... message.remove (), 5000);

Mã này có thể được sửa đổi để hiển thị thông báo ở bên trái, bên phải, bên dưới, áp dụng hình ảnh CSS để Fade Fade It trong phạm vi, v.v. Điều đó dễ dàng, vì chúng ta có tất cả các tọa độ và kích thước của yếu tố. Nhưng lưu ý các chi tiết quan trọng: khi trang được cuộn, thông báo sẽ chảy ra khỏi nút. Lý do là hiển nhiên: phần tử tin nhắn dựa vào vị trí: đã sửa, vì vậy nó vẫn ở cùng một vị trí của cửa sổ trong khi trang cuộn đi. Để thay đổi điều đó, chúng ta cần sử dụng tọa độ và vị trí dựa trên tài liệu: Tuyệt đối.

Tọa độ tài liệu tọa độ liên quan đến tài liệu bắt đầu từ góc trên bên trái của tài liệu, không phải cửa sổ. Trong CSS, tọa độ cửa sổ tương ứng với vị trí: Đã sửa lỗi, trong khi tọa độ tài liệu tương tự như vị trí: tuyệt đối trên đỉnh. Chúng ta có thể sử dụng vị trí: Tuyệt đối và TOP/Bên trái để đặt một cái gì đó ở một vị trí nhất định của tài liệu, để nó ở đó trong một cuộn trang. Nhưng chúng ta cần tọa độ phù hợp đầu tiên. Để rõ ràng, chúng tôi sẽ gọi tọa độ cửa sổ (clientX, clienty) và tọa độ tài liệu (trang, pagey). Khi trang không được cuộn, thì tọa độ cửa sổ và tọa độ tài liệu thực sự giống nhau. Điểm không phù hợp của họ quá:

Và nếu chúng ta cuộn nó, thì (clientx, clienty) thay đổi, vì chúng tương đối với cửa sổ, nhưng (pagex, pagey) vẫn giữ nguyên. Ở đây, cùng một trang sau cuộn dọc:

Khách hàng của tiêu đề "từ bài viết nổi bật của ngày hôm nay" đã trở thành 0, bởi vì phần tử hiện đang ở trên đầu cửa sổ. ClientX đã không thay đổi, vì chúng tôi đã cuộn theo chiều ngang. PageX và tọa độ pagey của phần tử vẫn giống nhau, bởi vì chúng liên quan đến tài liệu.

Nhận tọa độ tài liệu ở đó, không có phương pháp tiêu chuẩn nào để có được tọa độ tài liệu của một yếu tố. Nhưng nó dễ dàng viết nó. Hai hệ tọa độ được kết nối bằng công thức: ●

Khách hàng của tiêu đề "từ bài viết nổi bật của ngày hôm nay" đã trở thành 0, bởi vì phần tử hiện đang ở trên đầu cửa sổ. ClientX đã không thay đổi, vì chúng tôi đã cuộn theo chiều ngang. PageX và tọa độ pagey của phần tử vẫn giống nhau, bởi vì chúng liên quan đến tài liệu.

Nhận tọa độ tài liệu ở đó, không có phương pháp tiêu chuẩn nào để có được tọa độ tài liệu của một yếu tố. Nhưng nó dễ dàng viết nó. Hai hệ tọa độ được kết nối bằng công thức: ●

pagey = clienty + chiều cao của phần thẳng đứng cuộn ra của tài liệu. pagex = clientX + chiều rộng của phần ngang cuộn ra của tài liệu.

Hàm getCoords (ELEM) sẽ lấy tọa độ cửa sổ từ elem.getBoundingClientRect () và thêm cuộn hiện tại vào chúng: // Nhận tọa độ tài liệu của hàm phần tử GetCoords (elem) {

Đặt hộp = elem.getBoundingClientRect (); return {top: box.top + pageyoffset, trái: box.left + pageXoffset}; }

1

Tóm tắt Bất kỳ điểm nào trên trang đều có tọa độ: 1. Liên quan đến cửa sổ - elem.getBoundingClientRect (). 2. Liên quan đến tài liệu - elem.getBoundingClientRect () cộng với cuộn trang hiện tại. Các tọa độ cửa sổ là tuyệt vời để sử dụng với vị trí: cố định và tọa độ tài liệu làm tốt với vị trí: Tuyệt đối. Cả hai hệ thống tọa độ đều có các hệ thống của họ, và các hệ thống của họ, có những lúc chúng ta cần một hoặc một hệ thống khác, giống như vị trí CSS tuyệt đối và cố định.

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

4

. . . . . . . . . . . .

2

Mã của bạn nên sử dụng DOM để có được tọa độ cửa sổ của: 1. trên bên trái, góc ngoài (đơn giản). 2. Bottom-right, góc ngoài (quá đơn giản). 3. Phía trên bên trái, góc bên trong (khó hơn một chút). 4. BOTTOM-bên phải, góc bên trong (có một số cách, chọn một). Các tọa độ mà bạn tính toán phải giống như các tọa độ được trả về bởi nhấp chuột. P.S. Mã cũng sẽ hoạt động nếu phần tử có kích thước hoặc đường viền khác, không bị ràng buộc với bất kỳ giá trị cố định nào. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Hiển thị một ghi chú gần tầm quan trọng của phần tử: 5 Tạo một vị trí chức năng (neo, vị trí, ELEM) định vị ELEM, tùy thuộc vào vị trí ở đầu ("trên cùng"), phải ("phải") hoặc dưới cùng ("dưới cùng") của phần tử neo. Gọi nó bên trong hàm hiển thị (neo, vị trí, html) hiển thị một phần tử với lớp "ghi chú" và văn bản HTML tại vị trí đã cho gần

cái mỏ neo. Hiển thị các ghi chú như ở đây: Lorem Ipsum Dolor SIT AMET, lãnh đạo adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente. Lưu ý ở trên

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

P.S. Ghi chú nên có vị trí: Đã sửa cho nhiệm vụ này. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Hiển thị một ghi chú gần tầm quan trọng của phần tử: 5 Tạo một vị trí chức năng (neo, vị trí, ELEM) định vị ELEM, tùy thuộc vào vị trí ở đầu ("trên cùng"), phải ("phải") hoặc dưới cùng ("dưới cùng") của phần tử neo. Gọi nó bên trong hàm hiển thị (neo, vị trí, html) hiển thị một phần tử với lớp "ghi chú" và văn bản HTML tại vị trí đã cho gần

cái mỏ neo. Hiển thị các ghi chú như ở đây: Lorem Ipsum Dolor SIT AMET, lãnh đạo adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente. Lưu ý ở trên

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

P.S. Ghi chú nên có vị trí: Đã sửa cho nhiệm vụ này. Mở một hộp cát cho nhiệm vụ.

Hiển thị một ghi chú gần phần tử (tuyệt đối) tầm quan trọng: 5 Sửa đổi giải pháp của tác vụ trước đó để ghi chú sử dụng vị trí: tuyệt đối thay vì vị trí: cố định. Điều đó sẽ ngăn chặn sự chạy trốn của nó từ phần tử khi trang cuộn. Lấy giải pháp của nhiệm vụ đó như một điểm khởi đầu. Để kiểm tra cuộn, thêm phong cách. Để giải pháp

Định vị ghi chú bên trong (tuyệt đối) tầm quan trọng: 5

Mở rộng tác vụ trước đây hiển thị một ghi chú gần phần tử (tuyệt đối): Dạy vị trí chức năng (neo, vị trí, elem) để chèn elem bên trong mỏ neo. Giá trị mới cho vị trí: ●

Lưu ý ở bên phải

Lưu ý ở bên phải

Lưu ý ở bên phải

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Biểu mẫu các sự kiện phần tử: ●

Gửi - Khi khách truy cập gửi a.

Tập trung - Khi khách truy cập tập trung vào một yếu tố, ví dụ: trên một.

Sự kiện bàn phím: ●

Keydown và KeyUp - Khi khách truy cập nhấn và sau đó nhả nút.

Sự kiện tài liệu: ●

DomContentLoaded - Khi HTML được tải và xử lý, DOM được xây dựng đầy đủ.

Sự kiện CSS: ●

Chuyển tiếp-Khi một hoạt động CSS kết thúc.

Có nhiều sự kiện khác. Chúng tôi sẽ nhận được nhiều chi tiết hơn về các sự kiện cụ thể trong các chương tiếp theo.

Người xử lý sự kiện

Để phản ứng trên các sự kiện, chúng ta có thể chỉ định một người xử lý - một chức năng chạy trong trường hợp của một sự kiện. Người xử lý là một cách để chạy mã JavaScript trong trường hợp hành động của người dùng. Có một số cách để gán một người xử lý. Hãy cùng nhìn thấy họ, bắt đầu từ cái đơn giản nhất.

HTML-attribution Một trình xử lý có thể được đặt trong HTML với một thuộc tính có tên trên. Chẳng hạn, để gán một trình xử lý nhấp chuột cho đầu vào, chúng ta có thể sử dụng onclick, như ở đây:

Khi nhấp chuột, mã bên trong Onclick chạy. Xin lưu ý rằng bên trong Onclick, chúng tôi sử dụng các trích dẫn đơn, bởi vì bản thân thuộc tính có trong trích dẫn kép. Nếu chúng ta quên rằng mã nằm trong thuộc tính và sử dụng các trích dẫn kép bên trong, như thế này: onclick = "alert (" click! ")", Thì nó đã giành được công việc đúng. Một sự tham gia của HTML không phải là một nơi thuận tiện để viết nhiều mã, vì vậy chúng tôi nên tạo một chức năng JavaScript và gọi nó ở đó. Ở đây một nhấp chuột chạy chức năng Countrabbits ():

Đếm thỏ!

Như chúng ta đã biết, tên thuộc tính HTML không nhạy cảm với trường hợp, do đó, Onclick hoạt động cũng như onclick và onclick, nhưng thường các thuộc tính được hạ thấp: onclick.

Thuộc tính dom

Chúng ta có thể chỉ định một trình xử lý bằng một thuộc tính DOM trên. Ví dụ, elem.onclick:

Nhấp vào đây

Nếu trình xử lý được gán bằng cách sử dụng phương tiện HTML thì trình duyệt sẽ đọc nó, hãy tạo một hàm mới từ nội dung thuộc tính và ghi nó vào thuộc tính DOM. Vì vậy, cách này thực sự giống như cái trước. Trình xử lý luôn nằm trong thuộc tính DOM: thuộc tính HTML chỉ là một trong những cách để khởi tạo nó. Hai đoạn mã này hoạt động giống nhau: 1. Chỉ HTML:

Cái nút

2. HTML + JS:

Cái nút

2. HTML + JS:

Vì chỉ có một tài sản Onclick, chúng tôi có thể gán nhiều hơn một người xử lý sự kiện.

Nhấp vào đây

Nếu trình xử lý được gán bằng cách sử dụng phương tiện HTML thì trình duyệt sẽ đọc nó, hãy tạo một hàm mới từ nội dung thuộc tính và ghi nó vào thuộc tính DOM. Vì vậy, cách này thực sự giống như cái trước. Trình xử lý luôn nằm trong thuộc tính DOM: thuộc tính HTML chỉ là một trong những cách để khởi tạo nó. Hai đoạn mã này hoạt động giống nhau: 1. Chỉ HTML:

Cái nút

2. HTML + JS:

Vì chỉ có một tài sản Onclick, chúng tôi có thể gán nhiều hơn một người xử lý sự kiện.

Trong ví dụ dưới đây, việc thêm một trình xử lý với JavaScript ghi đè lên trình xử lý hiện có:

Nhân tiện, chúng ta có thể gán một chức năng hiện có như một người xử lý trực tiếp:

hàm saythanks () {alert ('cảm ơn!'); } elem.onclick = saythanks;

Để loại bỏ một người xử lý - gán elem.onclick = null.

Truy cập phần tử: Đây là giá trị của bên trong một trình xử lý là phần tử. Một trong đó có người xử lý trên đó. Trong nút bên dưới hiển thị nội dung của nó bằng cách sử dụng này.

Những sai lầm có thể xảy ra nếu bạn bắt đầu làm việc với sự kiện - xin lưu ý một số sự tinh tế. Hàm nên được gán là Saythanks, không phải Saythanks (). // nút bên phải.onclick = saythanks;

// Nút sai.onclick = Saythanks ();

Nếu chúng ta thêm dấu ngoặc đơn, Saythanks () - là một cuộc gọi chức năng. Vì vậy, dòng cuối cùng thực sự có kết quả của việc thực thi chức năng, điều đó không được xác định (vì hàm không trả về không có gì) và gán nó cho onclick. Điều đó không làm việc. Nhưng trong đánh dấu, chúng tôi cần các dấu ngoặc đơn:

Sự khác biệt là dễ dàng để giải thích. Khi trình duyệt đọc thuộc tính, nó tạo ra một hàm xử lý với cơ thể từ nội dung của nó. Vì vậy, ví dụ cuối cùng giống như:

nút.onclick = function () {Saythanks (); // Nội dung thuộc tính};

Sử dụng các chức năng, không phải chuỗi. Bài tập elem.onclick = "alert (1)" cũng sẽ hoạt động. Nó hoạt động vì lý do tương thích, nhưng không được khuyến khích. Don Tiết sử dụng SetAttribution cho người xử lý. Một cuộc gọi như vậy đã giành được công việc:

// Nhấp vào sẽ tạo lỗi, // Vì các thuộc tính luôn là chuỗi, hàm trở thành một chuỗi tài liệu.body.setAttribution ('onclick', function () {alert (1)});

Element.AddeventListener (Sự kiện, Trình xử lý [, Tùy chọn]);

Tên sự kiện, ví dụ: "nhấp chuột" . Handler chức năng xử lý. Tùy chọn một đối tượng tùy chọn bổ sung với các thuộc tính: ●

Một lần: Nếu đúng, thì người nghe sẽ tự động bị xóa sau khi nó kích hoạt. Chụp: Phase nơi xử lý sự kiện, sẽ được đề cập sau đó trong chương sủi bọt và bắt giữ. Vì lý do lịch sử, các tùy chọn cũng có thể là sai/đúng, điều đó giống như {Capture: false/true}. Bị động: Nếu đúng, thì trình xử lý sẽ không ngăn cảnDefault (), chúng tôi sẽ đề cập đến điều đó sau trong các hành động mặc định của trình duyệt.

Để xóa trình xử lý, hãy sử dụng removeEventListener: Element.RemoveEventListener (sự kiện, trình xử lý [, tùy chọn]);

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ("click", () => alert ('cảm ơn!')); // .... elem.RemoveEventListener ("Nhấp", () => alert ('cảm ơn!'));

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ("click", () => alert ('cảm ơn!')); // .... elem.RemoveEventListener ("Nhấp", () => alert ('cảm ơn!'));

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Một lần: Nếu đúng, thì người nghe sẽ tự động bị xóa sau khi nó kích hoạt. Chụp: Phase nơi xử lý sự kiện, sẽ được đề cập sau đó trong chương sủi bọt và bắt giữ. Vì lý do lịch sử, các tùy chọn cũng có thể là sai/đúng, điều đó giống như {Capture: false/true}. Bị động: Nếu đúng, thì trình xử lý sẽ không ngăn cảnDefault (), chúng tôi sẽ đề cập đến điều đó sau trong các hành động mặc định của trình duyệt.

Để xóa trình xử lý, hãy sử dụng removeEventListener: Element.RemoveEventListener (sự kiện, trình xử lý [, tùy chọn]);

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ("click", () => alert ('cảm ơn!')); // .... elem.RemoveEventListener ("Nhấp", () => alert ('cảm ơn!'));

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

elem.addeventListener ("click", () => alert ('cảm ơn!')); // .... elem.RemoveEventListener ("Nhấp", () => alert ('cảm ơn!'));

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

elem.addeventListener ("click", () => alert ('cảm ơn!')); // .... elem.RemoveEventListener ("Nhấp", () => alert ('cảm ơn!'));

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý () {alert ('cảm ơn!'); } input.AddEnentListener ("Nhấp", Handler); // .... input.RemoveEventListener ("Nhấp", Handler);

Mã cũng nên hoạt động với các kích thước bóng và trường khác nhau, không bị ràng buộc với bất kỳ giá trị cố định nào. Sử dụng Thuộc tính Event.ClientX/Event.Clienty cho tọa độ nhấp chuột.

Mở một hộp cát cho nhiệm vụ.

Tạo một menu trượt tầm quan trọng: 5 Tạo một menu mở/sụp đổ khi nhấp vào: ▶ Sweeties

(nhấp vào đây)!

P.S. HTML/CSS của tài liệu nguồn sẽ được sửa đổi. Mở một hộp cát cho nhiệm vụ.

Thêm một nút đóng tầm quan trọng: 5 Có một danh sách các tin nhắn. Sử dụng JavaScript để thêm nút đóng vào góc UPPER bên phải của mỗi tin nhắn. Kết quả sẽ trông như thế này:

[x]

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

Donkey con lừa hoặc mông (Equus Africanus asinus) là một thành viên được thuần hóa của gia đình ngựa, Equidae. Tổ tiên hoang dã của con lừa là mông hoang dã châu Phi, E. Phi. Con lừa đã được sử dụng như một động vật làm việc trong ít nhất 5000 năm.

Con mèo

Con mèo nhà (tiếng Latin: Felis Catus) là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

Tầm quan trọng của Carousel: 4 Tạo một băng chuyền của người Viking - một dải hình ảnh có thể được cuộn bằng cách nhấp vào mũi tên.

Trung tâm bóng sẽ đến chính xác dưới con trỏ trên nhấp chuột (nếu có thể mà không vượt qua cạnh trường). CSS-Animation được chào đón.

Bóng không được ranh giới trường chéo.

Điều này (= event.civerseTarget) là yếu tố, bởi vì trình xử lý chạy trên đó. event.target là phần tử cụ thể bên trong biểu mẫu thực sự được nhấp.

Kiểm tra xem: https://plnkr.co/edit/iapo3qfpdphzxju0jita?p=preview

Nó có thể là sự kiện.Target bằng này - khi nhấp chuột được thực hiện trực tiếp trên phần tử.

Ngừng sủi bọt một sự kiện sủi bọt đi từ phần tử đích thẳng lên. Thông thường, nó đi lên cho đến khi, sau đó để ghi lại đối tượng, và một số sự kiện thậm chí còn tiếp cận cửa sổ, gọi tất cả các trình xử lý trên đường dẫn. Nhưng bất kỳ người xử lý nào cũng có thể quyết định rằng sự kiện này đã được xử lý đầy đủ và ngăn chặn sự sủi bọt. Phương pháp cho nó là event.stoppropagation (). Chẳng hạn, ở đây Body.onclick không hoạt động nếu bạn nhấp vào:

Nhấp vào đây

Nhấp vào đây

sự kiện.

Nếu một phần tử có nhiều trình xử lý sự kiện trong một sự kiện, thì ngay cả khi một trong số chúng dừng sủi bọt, các yếu tố khác vẫn thực thi. Nói cách khác, Event.StopPropagation () dừng việc di chuyển lên trên, nhưng trên phần tử hiện tại, tất cả các trình xử lý khác sẽ chạy. Để ngăn chặn sự sủi bọt và ngăn chặn các trình xử lý trên phần tử hiện tại chạy, có một sự kiện phương thức. Sau khi không có người xử lý khác thực thi.

Don Tiết dừng sủi bọt mà không cần!

Bong bóng là thuận tiện. Don Tiết ngăn chặn nó mà không cần một nhu cầu thực sự: rõ ràng và kiến ​​trúc được suy nghĩ tốt. Đôi khi sự kiện.stoppropagation () tạo ra những cạm bẫy ẩn mà sau này có thể trở thành vấn đề. Ví dụ: 1. Chúng tôi tạo một menu lồng nhau. Mỗi menu con xử lý nhấp vào các yếu tố của nó và gọi stopPropagation để menu bên ngoài giành được kích hoạt. 2. Sau đó, chúng tôi quyết định bắt các nhấp chuột trên toàn bộ cửa sổ, để theo dõi hành vi của người dùng (nơi mọi người nhấp). Một số hệ thống phân tích làm điều đó. Thông thường mã sử dụng Document.AddeventListener ('Nhấp' ') để bắt tất cả các nhấp chuột. 3 Chúng tôi đã có một khu vực chết người khác. Không có nhu cầu thực sự để ngăn chặn sự sủi bọt. Một nhiệm vụ dường như yêu cầu có thể được giải quyết bằng các phương tiện khác. Một trong số đó là sử dụng các sự kiện tùy chỉnh, chúng tôi sẽ bao gồm chúng sau. Ngoài ra, chúng tôi có thể viết dữ liệu của mình vào đối tượng sự kiện trong một trình xử lý và đọc nó trong một đối tượng khác, vì vậy chúng tôi có thể chuyển cho người xử lý thông tin của phụ huynh về việc xử lý bên dưới.

Nắm bắt ở đó, một giai đoạn khác của việc xử lý sự kiện có tên là bắt giữ. Nó hiếm khi được sử dụng trong mã thực, nhưng đôi khi có thể hữu ích. Các sự kiện DOM tiêu chuẩn

Nó có thể là sự kiện.Target bằng này - khi nhấp chuột được thực hiện trực tiếp trên phần tử.

Ngừng sủi bọt một sự kiện sủi bọt đi từ phần tử đích thẳng lên. Thông thường, nó đi lên cho đến khi, sau đó để ghi lại đối tượng, và một số sự kiện thậm chí còn tiếp cận cửa sổ, gọi tất cả các trình xử lý trên đường dẫn. Nhưng bất kỳ người xử lý nào cũng có thể quyết định rằng sự kiện này đã được xử lý đầy đủ và ngăn chặn sự sủi bọt. Phương pháp cho nó là event.stoppropagation (). Chẳng hạn, ở đây Body.onclick không hoạt động nếu bạn nhấp vào:

Nhấp vào đây

sự kiện.

Nếu một phần tử có nhiều trình xử lý sự kiện trong một sự kiện, thì ngay cả khi một trong số chúng dừng sủi bọt, các yếu tố khác vẫn thực thi. Nói cách khác, Event.StopPropagation () dừng việc di chuyển lên trên, nhưng trên phần tử hiện tại, tất cả các trình xử lý khác sẽ chạy. Để ngăn chặn sự sủi bọt và ngăn chặn các trình xử lý trên phần tử hiện tại chạy, có một sự kiện phương thức. Sau khi không có người xử lý khác thực thi.

elem.addeventlistener (..., {capture: true}) // hoặc, chỉ là "true" là một bí danh đối với {capture: true} elem.addeventlistener (..., true)

Có hai giá trị có thể của tùy chọn chụp: ●

Nếu nó sai (mặc định), thì trình xử lý được đặt trên pha sủi bọt.

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 (giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử) không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức div

P

Hình thức div p

Mã đặt bộ xử lý nhấp vào mọi yếu tố trong tài liệu để xem cái nào đang hoạt động. Nếu bạn nhấp vào

, sau đó trình tự là:

1. HTML → Body → Form → Div (pha chụp, người nghe đầu tiên): 2. P (cụm mục tiêu, kích hoạt hai lần, khi chúng tôi đặt hai người nghe: chụp và sủi bọt) 3. Div → Mẫu (Giai đoạn sủi bọt, người nghe thứ hai). Có một sự kiện tài sản.Eventphase cho chúng ta biết số lượng pha mà sự kiện đã bị bắt. Nhưng nó hiếm khi được sử dụng, bởi vì chúng ta thường biết nó trong người xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener (..., true), thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener (..., đúng) để loại bỏ chính xác trình xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener (..., true), thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener (..., đúng) để loại bỏ chính xác trình xử lý.

Người nghe trên cùng một phần tử và cùng một pha chạy theo thứ tự đã đặt của họ

Nếu chúng ta có nhiều trình xử lý sự kiện ở cùng một pha, được gán cho cùng một yếu tố với AddEventListener, chúng sẽ chạy theo cùng thứ tự như chúng được tạo:

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 (giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử) không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức div

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 (giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử) không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức divP

Hình thức div p

Mã đặt bộ xử lý nhấp vào mọi yếu tố trong tài liệu để xem cái nào đang hoạt động. Nếu bạn nhấp vào

, sau đó trình tự là:

1. HTML → Body → Form → Div (pha chụp, người nghe đầu tiên): 2. P (cụm mục tiêu, kích hoạt hai lần, khi chúng tôi đặt hai người nghe: chụp và sủi bọt) 3. Div → Mẫu (Giai đoạn sủi bọt, người nghe thứ hai). Có một sự kiện tài sản.Eventphase cho chúng ta biết số lượng pha mà sự kiện đã bị bắt. Nhưng nó hiếm khi được sử dụng, bởi vì chúng ta thường biết nó trong người xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener (..., true), thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener (..., đúng) để loại bỏ chính xác trình xử lý.

Người nghe trên cùng một phần tử và cùng một pha chạy theo thứ tự đã đặt của họ

Nếu chúng ta có nhiều trình xử lý sự kiện ở cùng một pha, được gán cho cùng một yếu tố với AddEventListener, chúng sẽ chạy theo cùng thứ tự như chúng được tạo:

elem.addeventListener ("click", e => alert (1)); // Đảm bảo kích hoạt elem.addeventlistener đầu tiên ("Nhấp", e => alert (2));

Tóm tắt khi một sự kiện xảy ra - yếu tố lồng nhau nhất nơi nó xảy ra được gắn nhãn là phần tử mục tiêu của Google (Event.target). ●

Sau đó, sự kiện chuyển xuống từ root tài liệu sang event.target, người xử lý gọi được gán với addEventListener (...., true) trên đường (true là tốc ký cho {Capture: true}). Sau đó, người xử lý được gọi trên chính phần tử đích. Sau đó, sự kiện bong bóng từ Event.Target cho đến gốc, gọi Trình xử lý được gán bằng cách sử dụng và AddEventListener mà không có đối số thứ 3 hoặc với đối số thứ 3 Sai/{Capture: False}.

Mỗi người xử lý có thể truy cập các thuộc tính đối tượng sự kiện: ●

event.target - yếu tố sâu nhất có nguồn gốc sự kiện.
event.cienTarget (= this) - phần tử hiện tại xử lý sự kiện (một phần có trình xử lý trên đó) sự kiện.EventPhase - pha hiện tại (bắt giữ = 1, Target = 2, sủi bọt = 3).
...Tây Bắc...Northwest... ......

Bảng có 9 ô, nhưng có thể có 99 hoặc 9999, không quan trọng. Nhiệm vụ của chúng tôi là làm nổi bật một ô

trong một cái nhấp chuột. Thay vì gán một trình xử lý onclick cho mỗi . Nó sẽ sử dụng Event.Target để có được phần tử đã nhấp và làm nổi bật nó. Mật mã:

Cho phépTD; bảng.onclick = function (event) {let target = event.target; // Nhấp chuột ở đâu?

if (target.tagname! = 'td') return; // Không phải trên TD? Sau đó, chúng tôi không quan tâm nổi bật (mục tiêu); // làm nổi bật nó}; hàm nhấn mạnh (td) {if (selectTd) {// xóa điểm nổi bật hiện có nếu bất kỳ lựa chọn nào } selectTd = td; selectTd.ClassList.Add ('tô sáng'); // làm nổi bật TD mới}

Một mã như vậy không quan tâm đến việc có bao nhiêu ô trong bảng. Chúng tôi có thể thêm/xóa

Đương nhiên, nếu một nhấp chuột xảy ra trên đó thì nó sẽ trở thành giá trị của Event.Target. then it becomes the value of event.target .

Trong bảng xử lý.onclick, chúng ta nên tham gia

Động lực bất cứ lúc nào và sự nổi bật vẫn sẽ hoạt động. Tuy nhiên, có một nhược điểm. Nhấp chuột có thể xảy ra không trên , nhưng bên trong nó. Trong trường hợp của chúng tôi nếu chúng ta nhìn vào bên trong HTML, chúng ta có thể thấy các thẻ lồng nhau bên trong , giống : : Tây Bắc ... ... hay không. Ở đây, mã hóa được cải thiện:

bảng.onclick = function (event) {let td = event.target.closest ('td'); // (1) if (! Td) trả về; // (2) if (! Bảng.contains (td)) return; // (3) nổi bật (TD); // (4) };

Giải thích: 1. Phương thức elem.closest (bộ chọn) trả về tổ tiên gần nhất phù hợp với bộ chọn. Trong trường hợp của chúng tôi, chúng tôi tìm kiếm

Trên đường lên từ phần tử nguồn. 2. Nếu event.target không ở trong bất kỳ , sau đó cuộc gọi trở lại NULL, và chúng tôi không phải làm bất cứ điều gì. 3. Trong trường hợp bảng lồng nhau, sự kiện.Target có thể là một nằm bên ngoài bàn hiện tại. Vì vậy, chúng tôi kiểm tra xem đó có thực sự là bảng của chúng tôi không . 4. Và, nếu nó như vậy, thì hãy làm nổi bật nó.

Ví dụ về ủy quyền: Các hành động trong đánh dấu ủy quyền sự kiện có thể được sử dụng để tối ưu hóa việc xử lý sự kiện. Chúng tôi sử dụng một trình xử lý duy nhất cho các hành động tương tự trên nhiều yếu tố. Giống như chúng tôi đã làm điều đó để làm nổi bật

. Nhưng chúng ta cũng có thể sử dụng một người xử lý duy nhất làm điểm vào cho nhiều thứ khác nhau. Chẳng hạn, chúng tôi muốn tạo một menu với các nút Save Save, Tải, tải, Tìm kiếm, v.v. Và có một đối tượng với các phương thức lưu, tải, tìm kiếm. Ý tưởng đầu tiên có thể là gán một trình xử lý riêng cho mỗi nút. Nhưng có một giải pháp thanh lịch hơn. Chúng tôi có thể thêm một trình xử lý cho toàn bộ menu và các thuộc tính DataAction cho các nút có phương thức gọi: bấm để lưu

Trình xử lý đọc thuộc tính và thực thi phương thức. Hãy xem ví dụ làm việc:

Lưu tải

Tìm kiếm

Tiết kiệm

Trọng tải

Tìm kiếm

Xin lưu ý rằng điều này.onclick bị ràng buộc với điều này trong (*). Điều đó rất quan trọng, bởi vì nếu không thì bên trong nó sẽ tham chiếu phần tử DOM (ELEM), không phải đối tượng menu và [hành động] này sẽ không phải là thứ chúng ta cần. Vì vậy, những gì phái đoàn cho chúng ta ở đây?

Chúng tôi không cần phải viết mã để gán một trình xử lý cho mỗi nút. Chỉ cần tạo một phương pháp và đặt nó vào đánh dấu. Cấu trúc HTML linh hoạt, chúng ta có thể thêm/xóa các nút bất cứ lúc nào.

Chúng tôi cũng có thể sử dụng các lớp .action-save, .action-tải, nhưng một hành động dữ liệu thuộc tính tốt hơn về mặt ngữ nghĩa. Và chúng ta cũng có thể sử dụng nó trong các quy tắc CSS.

Mô hình hành vi của người Viking, chúng tôi cũng có thể sử dụng Phái đoàn sự kiện để thêm các hành vi của người Viking vào các yếu tố được khai báo, với các thuộc tính và lớp đặc biệt. Mẫu có hai phần: 1. Chúng tôi thêm một thuộc tính đặc biệt vào một phần tử. 2. Một trình xử lý toàn tài liệu theo dõi các sự kiện và nếu một sự kiện xảy ra trên một phần tử quy kết-thực hiện hành động.

Chẳng hạn, ở đây, ở đây, việc ghi dữ liệu thuộc tính thêm một hành vi: Giá trị tăng lên trên các nút Nhấp vào các nút:

Counter: Một bộ đếm nữa:

Counter: 1 một bộ đếm nữa: 2

Nếu chúng ta nhấp vào một nút - giá trị của nó được tăng lên. Không phải nút, nhưng cách tiếp cận chung là quan trọng ở đây. Có thể có nhiều thuộc tính có dữ liệu như chúng ta muốn. Chúng ta có thể thêm những cái mới vào HTML bất cứ lúc nào. Sử dụng phái đoàn sự kiện, chúng tôi đã mở rộng HTML, đã thêm một thuộc tính mô tả một hành vi mới.

Đối với trình xử lý cấp tài liệu-Luôn luôn luôn

Khi chúng tôi chỉ định một trình xử lý sự kiện cho đối tượng tài liệu, chúng tôi nên luôn sử dụng AddEventListener, không phải tài liệu. Đối với các dự án thực tế, điều bình thường là có nhiều trình xử lý trên tài liệu được đặt bởi các phần khác nhau của mã.

Toggler một ví dụ nữa. Một nhấp chuột vào một phần tử với Data-Toggle-ID thuộc tính sẽ hiển thị/ẩn phần tử bằng ID đã cho:

Hiển thị biểu mẫu đăng ký

Thư của bạn:

Hiển thị biểu mẫu đăng ký

Hãy để lưu ý một lần nữa những gì chúng tôi đã làm. Bây giờ, để thêm chức năng chuyển đổi vào một phần tử-ở đó, không cần phải biết JavaScript, chỉ cần sử dụng thuộc tính Datatoggle-id. Điều đó có thể trở nên thực sự thuận tiện - không cần phải viết JavaScript cho mọi yếu tố như vậy. Chỉ cần sử dụng hành vi. Trình xử lý cấp tài liệu làm cho nó hoạt động cho bất kỳ yếu tố nào của trang. Chúng ta cũng có thể kết hợp nhiều hành vi trên một yếu tố duy nhất. Mô hình hành vi của người Viking có thể là một sự thay thế của các bản dựng mini của JavaScript.

Tóm tắt Phái đoàn sự kiện thực sự tuyệt vời! Nó là một trong những mẫu hữu ích nhất cho các sự kiện DOM. Nó thường được sử dụng để thêm xử lý cho nhiều yếu tố tương tự, nhưng không chỉ cho điều đó. Thuật toán: 1. Đặt một trình xử lý duy nhất trên container. 2. Trong Handler - Kiểm tra phần tử nguồn .Target. 3. Nếu sự kiện xảy ra bên trong một yếu tố khiến chúng tôi quan tâm, thì hãy xử lý sự kiện. Lợi ích:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Đầu tiên, sự kiện phải sủi bọt. Một số sự kiện không bong bóng. Ngoài ra, người xử lý cấp thấp không nên sử dụng Event.StopPropagation (). Thứ hai, phái đoàn có thể thêm tải CPU, bởi vì trình xử lý cấp độ container phản ứng trên các sự kiện ở bất kỳ nơi nào của container, bất kể họ có quan tâm đến chúng tôi hay không. Nhưng thông thường tải không đáng kể, vì vậy chúng tôi không tính đến nó.

Nhiệm vụ ẩn tin nhắn với phái đoàn

Tầm quan trọng: 5 Có một danh sách các tin nhắn với các nút xóa [x]. Làm cho các nút hoạt động. Như thế này: [x]

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

[x]

Donkey con lừa hoặc mông (Equus Africanus asinus) là một thành viên được thuần hóa của gia đình ngựa, Equidae. Tổ tiên hoang dã của con lừa là mông hoang dã châu Phi, E. Phi. Con lừa đã được sử dụng như một động vật làm việc trong ít nhất 5000 năm.

Con mèo

Con mèo nhà (tiếng Latin: Felis Catus) là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Con mèo

Con mèo nhà (tiếng Latin: Felis Catus) là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp
Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào: Động vật Động vật có vú bò con lừa chó Hổ khác Chim con thằn lằn cá cá hồ cá cá con cá hồi biển biển Angelfish
5 Yêu cầu: ●
10 Chỉ có một người xử lý sự kiện (sử dụng phái đoàn)

Một nhấp chuột bên ngoài tiêu đề nút (trên một khoảng trống) không nên làm gì cả.

Mở một hộp cát cho nhiệm vụ.

2

Tầm quan trọng của bảng có thể sắp xếp

12

Các yếu tố nên sắp xếp nó theo cột tương ứng. Mỗi

9

Có loại trong thuộc tính, như thế này: ...

1

Tuổi tác

Tên

Con mèo

Con mèo nhà (tiếng Latin: Felis Catus) là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào:

Động vật Động vật có vú bò con lừa chó Hổ khác Chim con thằn lằn cá cá hồ cá cá con cá hồi biển biển Angelfish

Yêu cầu: ●

Chỉ có một người xử lý sự kiện (sử dụng phái đoàn)

Bạn sẽ cần hai sự kiện ở đây: ●

MouseOver kích hoạt khi một con trỏ đi qua một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Trình duyệt hành động mặc định Nhiều sự kiện tự động dẫn đến các hành động của trình duyệt. Ví dụ:

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Trình duyệt hành động mặc định Nhiều sự kiện tự động dẫn đến các hành động của trình duyệt. Ví dụ:

Một cú nhấp chuột vào một liên kết - bắt đầu đi đến URL của nó.

Nhấp vào nút gửi bên trong một biểu mẫu - bắt đầu gửi vào máy chủ.

Nhấn nút chuột qua văn bản và di chuyển nó - chọn văn bản.

Nếu chúng tôi xử lý một sự kiện trong JavaScript, thường thì chúng tôi không muốn có các hành động của trình duyệt. May mắn thay, nó có thể được ngăn chặn.

Ngăn chặn các hành động của trình duyệt Có hai cách để nói với trình duyệt mà chúng tôi không muốn hành động: ●

Cách chính là sử dụng đối tượng sự kiện. Có một sự kiện phương thức.PreventDefault (). Nếu trình xử lý được gán bằng cách sử dụng (không phải bởi addeventListener), thì chúng ta chỉ có thể trả về sai từ nó.

Trong ví dụ dưới đây, nhấp vào các liên kết không dẫn đến thay đổi URL:

Bấm vào đây hoặc đây , that doesn’t work. Search engines follow links while indexing.

Không cần thiết để trả về đúng

Giá trị được trả về bởi một người xử lý sự kiện thường bị bỏ qua. Ngoại lệ duy nhất - là trả về sai từ một trình xử lý được gán bằng cách sử dụng. Trong tất cả các trường hợp khác, việc trả lại là không cần thiết và dù sao thì nó cũng không được xử lý.

Ví dụ: Menu Xem xét menu trang web, như thế này:

Đây là cách mà nó trông với một số CSS:

HTML

JavaScript

CSS

Các mục menu là liên kết, không phải nút. Có một số lợi ích, ví dụ: ●

Theo mặc định, trình duyệt trên sự kiện bối cảnh (nhấp chuột phải) hiển thị menu ngữ cảnh với các tùy chọn tiêu chuẩn. Chúng ta có thể ngăn chặn nó và thể hiện của riêng mình, như thế này:

Nhấp chuột phải vào menu ngữ cảnh trình duyệt

Nhấp chuột phải vào menu ngữ cảnh của chúng tôi

Nhấp chuột phải vào menu ngữ cảnh trình duyệt

Nhấp chuột phải vào menu ngữ cảnh của chúng tôi

Bây giờ, hãy để nói rằng chúng tôi muốn triển khai menu ngữ cảnh toàn tài liệu của riêng mình, với các tùy chọn của chúng tôi. Và bên trong tài liệu, chúng tôi có thể có các yếu tố khác với các menu ngữ cảnh của riêng họ:

Nhấp chuột phải vào đây cho menu ngữ cảnh tài liệu

Nhấp chuột phải vào đây cho menu ngữ cảnh nút

Nhấp chuột phải vào đây cho menu ngữ cảnh tài liệu Nhấp chuột phải vào đây cho menu ngữ cảnh nút

Vấn đề là khi chúng tôi nhấp vào ELEM, chúng tôi nhận được hai menu: mức nút và (sự kiện bong bóng lên) menu cấp tài liệu. Làm thế nào để sửa chữa nó? Một trong những giải pháp là suy nghĩ như: Chúng tôi hoàn toàn xử lý sự kiện trong trình xử lý nút, hãy để ngăn chặn nó và sử dụng Event.StopPropagation ():

Nhấp chuột phải vào menu tài liệu

Nhấp chuột phải vào menu nút (sửa bằng event.stoppropagati

Nhấp chuột phải vào menu Tài liệu Nhấp chuột phải vào menu nút (được sửa bằng Event.StopPropagation)

Bây giờ menu cấp nút hoạt động như dự định. Nhưng giá cao. Chúng tôi mãi mãi từ chối quyền truy cập vào thông tin về nhấp chuột phải cho bất kỳ mã bên ngoài nào, bao gồm cả các bộ đếm thu thập số liệu thống kê, v.v. Điều đó khá không khôn ngoan. Một giải pháp thay thế sẽ là kiểm tra trình xử lý tài liệu nếu hành động mặc định được ngăn chặn? Nếu nó là như vậy, thì sự kiện đã được xử lý và chúng tôi không cần phải phản ứng với nó.

Nhấp chuột phải vào menu tài liệu (sửa bằng event.defaultprevented)

Nhấp chuột phải vào menu nút

Nhấp chuột phải vào menu tài liệu (sửa bằng event.defaultprevented) Nhấp chuột phải vào menu nút

Bây giờ mọi thứ cũng hoạt động chính xác. Nếu chúng ta có các yếu tố lồng nhau, và mỗi phần trong số chúng có một menu ngữ cảnh của riêng nó, điều đó cũng sẽ hoạt động. Chỉ cần đảm bảo kiểm tra Event.DefaultPrevent trong mỗi trình xử lý bối cảnh.

event.stoppropagation () và event.preventDefault ()

Như chúng ta có thể thấy rõ, event.stopPropagation () và event.preventDefault () (còn được gọi là return false) là hai điều khác nhau. Họ không liên quan đến nhau.

event.stoppropagation () và event.preventDefault ()

Như chúng ta có thể thấy rõ, event.stopPropagation () và event.preventDefault () (còn được gọi là return false) là hai điều khác nhau. Họ không liên quan đến nhau.

Kiến trúc menu bối cảnh lồng nhau

Ngoài ra còn có những cách khác để thực hiện các menu bối cảnh lồng nhau. Một trong số đó là có một đối tượng toàn cầu đặc biệt với một phương thức xử lý Document.onContextMenu, và cả các phương thức cho phép lưu trữ các trình xử lý cấp độ thấp hơn khác nhau trong đó. Đối tượng sẽ bắt bất kỳ nhấp chuột phải, nhìn qua các trình xử lý được lưu trữ và chạy cái thích hợp. Nhưng sau đó, mỗi đoạn mã muốn một menu ngữ cảnh nên biết về đối tượng đó và sử dụng trợ giúp của nó thay vì trình xử lý bối cảnh riêng.

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Mousedown - bắt đầu lựa chọn (di chuyển chuột sang chọn).

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Mousedown - bắt đầu lựa chọn (di chuyển chuột sang chọn).

Nhấp vào - Kiểm tra/bỏ qua đầu vào.

Gửi - Nhấp vào hoặc nhấn nhập vào bên trong trường biểu mẫu khiến sự kiện này xảy ra và trình duyệt gửi biểu mẫu sau nó. Bánh xe - Lăn một sự kiện bánh xe chuột có cuộn là hành động mặc định. Keydown - Nhấn phím có thể dẫn đến việc thêm một ký tự vào một trường hoặc các hành động khác. bối cảnh-sự kiện xảy ra trên một cú nhấp chuột phải, hành động là hiển thị menu ngữ cảnh trình duyệt. …có nhiều…

Tất cả các hành động mặc định có thể được ngăn chặn nếu chúng tôi muốn xử lý sự kiện riêng bởi JavaScript.

Để ngăn chặn hành động mặc định - sử dụng một trong hai sự kiện.preventDefault () hoặc trả về sai. Phương pháp thứ hai chỉ hoạt động cho các trình xử lý được gán với ON. Bị động: Tùy chọn thực sự của AddEventListener nói với trình duyệt rằng hành động sẽ không được ngăn chặn. Điều đó hữu ích cho một số sự kiện di động, như TouchStart và TouchMove, để nói với trình duyệt rằng không nên chờ tất cả các trình xử lý hoàn thành trước khi cuộn. Nếu hành động mặc định được ngăn chặn, giá trị của event.defaultprevented trở thành đúng, nếu không thì nó sai.

Nhiệm vụ tại sao "trả lại sai" không hoạt động? Tầm quan trọng: 3 Tại sao trong mã dưới đây trả về sai không hoạt động?

Trình duyệt sẽ truy cập W3.org

Trình duyệt sẽ truy cập W3.org

Trình duyệt theo URL trên nhấp chuột, nhưng chúng tôi không muốn nó. Làm thế nào để khắc phục? Để giải pháp

Bắt các liên kết trong tầm quan trọng của phần tử: 5 Tạo tất cả các liên kết bên trong phần tử với ID = "Nội dung" Hỏi người dùng nếu họ thực sự muốn rời đi. Và nếu họ don thì don don theo dõi. Như thế này: #Contents Làm thế nào để đọc Wikipedia hoặc truy cập w3.org và tìm hiểu về các tiêu chuẩn hiện đại?

Chi tiết: ●

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở (Menu mở), chọn (một mục được chọn), v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Sự kiện xây dựng sự kiện tạo thành một hệ thống phân cấp, giống như các lớp phần tử DOM. Root là lớp sự kiện tích hợp. Chúng ta có thể tạo các đối tượng sự kiện như thế này: LET EVEN = new Event (loại sự kiện [, Tùy chọn]);

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở (Menu mở), chọn (một mục được chọn), v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Sự kiện xây dựng sự kiện tạo thành một hệ thống phân cấp, giống như các lớp phần tử DOM. Root là lớp sự kiện tích hợp. Chúng ta có thể tạo các đối tượng sự kiện như thế này: LET EVEN = new Event (loại sự kiện [, Tùy chọn]);

Đối số: ●

Loại sự kiện-có thể là bất kỳ chuỗi nào, như "Nhấp" hoặc của chúng tôi như "Hey-ho!" .

Tùy chọn - Đối tượng có hai thuộc tính tùy chọn: ●

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Để giải pháp

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở (Menu mở), chọn (một mục được chọn), v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Xin chào cho John!

Thuộc tính chi tiết có thể có bất kỳ dữ liệu. Về mặt kỹ thuật, chúng ta có thể sống mà không có, bởi vì chúng ta có thể gán bất kỳ thuộc tính nào vào một đối tượng sự kiện mới thông thường sau khi tạo ra nó. Nhưng CustomEvent cung cấp lĩnh vực chi tiết đặc biệt để nó trốn tránh xung đột với các thuộc tính sự kiện khác. Lớp sự kiện kể một cái gì đó về loại sự kiện nào, và nếu sự kiện này là tùy chỉnh, thì chúng ta nên sử dụng Customevent chỉ để rõ ràng về nó là gì.

event.preventDefault () chúng ta có thể gọi event.preventDefault () trên một sự kiện do tập lệnh tạo nếu có thể hủy: thực sự được chỉ định. Tất nhiên, nếu sự kiện này có tên không chuẩn, thì nó không được trình duyệt biết đến và ở đó, không có hành động nào của trình duyệt mặc định. Nhưng mã tạo sự kiện có thể lên kế hoạch cho một số hành động sau khi DispatchEvent. Call of Event.PreventDefault () là một cách để người xử lý gửi tín hiệu rằng những hành động đó không nên được thực hiện. Trong trường hợp đó, cuộc gọi đến elem.dispatchevent (sự kiện) trả về sai. Và mã tạo sự kiện biết rằng việc xử lý không nên tiếp tục. Chẳng hạn, trong ví dụ bên dưới có hàm ẩn (). Nó tạo ra sự kiện "ẩn" trên phần tử #Rabbit, thông báo cho tất cả các bên quan tâm rằng con thỏ sẽ ẩn.

Một người xử lý do Rabbit.addeventlistener đặt ra ('ẩn', ...) sẽ tìm hiểu về điều đó và, nếu nó muốn, có thể ngăn chặn hành động đó bằng cách gọi event.preventDefault (). Sau đó, con thỏ đã giành được sự che giấu:

| \ /| \ | _ | / /. .

Để có được văn bản, đang chờ phản hồi.Text () thay vì. text (); // đọc phần thân phản hồi dưới dạng cảnh báo văn bản (text.slice (0, 80) + '...');

Là một trường hợp hiển thị để đọc ở định dạng nhị phân, hãy để Fetch và hiển thị một hình ảnh (xem Chương Blob để biết chi tiết về các hoạt động trên Blobs):

let feedback = Await fetch ('/artical/fetch/logo fetch.svg'); Đặt blob = chờ phản hồi.blob (); // Tải xuống dưới dạng đối tượng Blob // Tạo cho nó cho Img = Document.CreateEement ('IMG'); img.style = 'Vị trí: Đã sửa; Top: 10px; trái: 10px; chiều rộng: 100px'; document.body.Append (IMG); // hiển thị nó img.src = url.createObjectUrl (blob); setTimeout (() => {// Ẩn sau ba giây img.remove (); url.revokeobjecturl (img.src);}, 3000);

Quan trọng:

Chúng ta chỉ có thể chọn một phương pháp phân tích cơ thể. Nếu chúng ta nhận được phản hồi với phản hồi.text (), thì about.json () đã giành được công việc, vì nội dung cơ thể đã được xử lý.

Đặt văn bản = đang chờ phản hồi.text (); // Phản hồi cơ thể tiêu thụ Let phân tích cú pháp = đang chờ phản hồi.json (); // thất bại (đã được tiêu thụ)

Các tiêu đề có một đối tượng tiêu đề giống như bản đồ trong phản hồi.headers. Chúng ta có thể nhận được các tiêu đề riêng lẻ hoặc lặp lại chúng:

Let trả lời = Await Fetch ('https://api.github.com/repos/javaScript-tutorial/en.java // Nhận một cảnh báo tiêu đề (respession.headers.get (' Content-type ')); // Ứng dụng /json; charet = utf-8 // lặp lại tất cả các tiêu đề cho (hãy [khóa, giá trị] của phản hồi.headers) {alert (`$ {key} = $ {value}`);}

Để đặt tiêu đề, chúng ta có thể sử dụng tùy chọn tiêu đề, như thế này: let reapes = fetch (bảo vệURL, {tiêu đề: {xác thực: 'abcdef'}});

Nhưng có một danh sách các tiêu đề HTTP bị cấm

Chấp nhận-Charset, Chấp nhận-Mã hóa

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Thời lượng nội dung

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Thời lượng nội dung

Cookie, cookie2

Nộp

Ở đây, chúng tôi cũng không cần thiết lập loại nội dung theo cách thủ công, bởi vì một đối tượng blob có loại tích hợp (ở đây hình ảnh/png, như được tạo bởi toblob). Hàm Substem () có thể được viết lại mà không cần Async/Await như thế này: function subrow () {canvaselem.toBlob (function (blob) {fetch ('/artical/fetch/post/post

cơ thể: blob}) .then (answer => respession.json ()) .then (result => alert (json.Stringify (result, null, 2)))}, 'hình ảnh/png'); }

Tóm tắt một yêu cầu tìm nạp điển hình bao gồm hai cuộc gọi đang chờ đợi: Let trả lời = Await Fetch (URL, Tùy chọn); // giải quyết với các tiêu đề phản hồi cho kết quả = chờ phản hồi.json (); // đọc cơ thể là json

Hoặc, theo phong cách hứa hẹn:

Tìm nạp (URL, Tùy chọn) .then (Phản hồi => Trả lời.json ()) .then (result => / * Kết quả quá trình * /)

Thuộc tính phản hồi: ●

Phản hồi.Status - Mã HTTP của phản hồi,

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

respons.json () - phân tích phản hồi là đối tượng JSON,

phản hồi.text () - trả về phản hồi dưới dạng văn bản,

reserver.formData () - Trả về phản hồi dưới dạng đối tượng formData (mã hóa biểu mẫu/nhiều phần phản hồi dưới dạng mảngbuffer (dữ liệu nhị phân thuần túy),

Tùy chọn tìm nạp cho đến nay: ●

Phương pháp-HTTP-Method,

Tiêu đề - một đối tượng có tiêu đề yêu cầu (không cho phép bất kỳ tiêu đề nào),

Cơ thể - Chuỗi, FormData, Bộ đệm, Blob hoặc UrlSearchParams đối tượng để gửi.

Trong các chương tiếp theo, chúng tôi sẽ thấy nhiều tùy chọn hơn và sử dụng các trường hợp tìm nạp.

Nộp

Nhiệm vụ tìm nạp người dùng từ GitHub Tạo một hàm Async GetUsers (tên), nhận được một loạt các đăng nhập GitHub, tìm nạp người dùng từ GitHub và trả về một loạt người dùng GitHub. URL GitHub với người dùng Informaiterton cho tên người dùng đã cho là: https://api.github.com/users/username. Có một ví dụ thử nghiệm trong hộp cát. Chi tiết quan trọng: 1. Cần có một yêu cầu tìm nạp cho mỗi người dùng. Và các yêu cầu không nên chờ đợi nhau. Để dữ liệu đến càng sớm càng tốt. 2. Nếu bất kỳ yêu cầu nào thất bại, hoặc nếu không có người dùng nào như vậy, chức năng sẽ trả lại null trong mảng kết quả. Mở một hộp cát với các bài kiểm tra.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Hình ảnh:

Hình ảnh: Chọn Tệp Không chọn tệp

John

Nộp

Gửi một biểu mẫu với dữ liệu blob như chúng tôi đã thấy trong chương tìm nạp, gửi một blob được tạo động, ví dụ: Một hình ảnh, là dễ dàng. Chúng ta có thể cung cấp nó trực tiếp dưới dạng cơ thể tham số tìm nạp. Mặc dù vậy, trong thực tế, nó thường thuận tiện để gửi một hình ảnh không riêng biệt, nhưng là một phần của biểu mẫu, với các trường bổ sung, chẳng hạn như tên của tên và các siêu dữ liệu khác. Ngoài ra, các máy chủ thường phù hợp hơn để chấp nhận các hình thức được mã hóa nhiều phần, thay vì dữ liệu nhị phân thô. Ví dụ này gửi một hình ảnh từ, cùng với một số trường khác, sử dụng formdata:

Nộp

Gửi một biểu mẫu với dữ liệu blob như chúng tôi đã thấy trong chương tìm nạp, gửi một blob được tạo động, ví dụ: Một hình ảnh, là dễ dàng. Chúng ta có thể cung cấp nó trực tiếp dưới dạng cơ thể tham số tìm nạp. Mặc dù vậy, trong thực tế, nó thường thuận tiện để gửi một hình ảnh không riêng biệt, nhưng là một phần của biểu mẫu, với các trường bổ sung, chẳng hạn như tên của tên và các siêu dữ liệu khác. Ngoài ra, các máy chủ thường phù hợp hơn để chấp nhận các hình thức được mã hóa nhiều phần, thay vì dữ liệu nhị phân thô. Ví dụ này gửi một hình ảnh từ, cùng với một số trường khác, sử dụng formdata:

Xin lưu ý cách thêm blob hình ảnh: formData.Append ("Image", ImageBlob, "Image.png");

Điều đó giống như khi có trong biểu mẫu và khách truy cập đã gửi một tệp có tên Image.png (đối số thứ 3) từ hệ thống tập tin của họ.

Tóm tắt các đối tượng FormData  Các đối tượng được sử dụng để chụp biểu mẫu HTML và gửi nó bằng cách tìm nạp hoặc phương thức mạng khác. Chúng ta có thể tạo FormData mới (biểu mẫu) từ biểu mẫu HTML hoặc tạo một đối tượng trống, sau đó nối các trường bằng các phương thức: ●

formdata.append (tên, giá trị)

formdata.append (tên, giá trị)

formdata.append (tên, giá trị)

formdata.Append (tên, blob, fileName)

formdata.set (tên, giá trị)

formdata.append (tên, giá trị)

formdata.append (tên, giá trị)

formdata.Append (tên, blob, fileName)

formdata.set (tên, giá trị)

formdata.set (tên, blob, filename)

Hai đặc thù ở đây: 1. Phương thức SET sẽ loại bỏ các trường có cùng tên, phần chen lấn không. 2. Để gửi một tệp, cần phải có cú pháp 3 đối số, đối số cuối cùng là tên tệp, thông thường được lấy từ hệ thống tập tin người dùng. Các phương pháp khác là: ●

formdata.delete (tên)

formdata.append (tên, giá trị)

formdata.Append (tên, blob, fileName)

formdata.set (tên, giá trị)

formdata.set (tên, blob, filename)

Hai đặc thù ở đây: 1. Phương thức SET sẽ loại bỏ các trường có cùng tên, phần chen lấn không. 2. Để gửi một tệp, cần phải có cú pháp 3 đối số, đối số cuối cùng là tên tệp, thông thường được lấy từ hệ thống tập tin người dùng. Các phương pháp khác là: ●

Concatenates những thứ đó, vì vậy, có một số mã để làm điều đó: 1. Chúng tôi tạo Uint8array mới (nhận được mô tả)-một mảng đồng tương tự với độ dài kết hợp. 2. Sau đó, sử dụng phương thức .set (chunk, vị trí) để sao chép từng phần khác nhau trong mảng kết quả. 5. Chúng tôi có kết quả trong chunksall. Mặc dù vậy, nó là một mảng byte, không phải là một chuỗi. Để tạo một chuỗi, chúng ta cần giải thích các byte này. Các văn bản tích hợp làm chính xác điều đó. Sau đó, chúng ta có thể json. Điều gì sẽ xảy ra nếu chúng ta cần nội dung nhị phân thay vì JSON? Điều đó thậm chí còn đơn giản hơn. Thay thế các bước 4 và 5 bằng một cuộc gọi đến một đốm màu từ tất cả các khối:

Đặt BLOB = BLOB MỚI (khối);

Cuối cùng, chúng ta có kết quả (như một chuỗi hoặc một đốm màu, bất cứ điều gì là thuận tiện) và theo dõi tiến trình trong quá trình. Một lần nữa, xin lưu ý rằng, không phải để tải lên tiến trình (không có cách nào với Fetch), chỉ để tải xuống tiến trình.

Fetch: hủy bỏ việc tìm kiếm là một chút khó khăn. Hãy nhớ rằng, lấy lại một lời hứa. Và JavaScript thường không có khái niệm về việc hủy bỏ một lời hứa. Vậy làm thế nào chúng ta có thể hủy bỏ một tìm nạp? Có một đối tượng tích hợp đặc biệt cho các mục đích như vậy: AbortControll. Việc sử dụng khá đơn giản: ●

Bước 1: Tạo bộ điều khiển:

Đặt bộ điều khiển = new AbortControll ();

Một bộ điều khiển là một đối tượng cực kỳ đơn giản. Nó có một phương thức hủy bỏ () và một tín hiệu thuộc tính duy nhất. Khi hủy bỏ ()

Đặt bộ điều khiển = new AbortControll (); Đặt tín hiệu = bộ điều khiển.signal;

// kích hoạt khi bộ điều khiển.abort () được gọi là tín hiệu.addeventlistener ('abort', () => alert ("hủy bỏ!")); bộ điều khiển.abort (); // Huỷ bỏ! cảnh báo (tín hiệu.aborted); // Đúng (sau khi hủy bỏ)

Bước 2: Chuyển thuộc tính tín hiệu để tìm nạp tùy chọn: Đặt bộ điều khiển = new AbortControll (); tìm nạp (url, {tín hiệu: bộ điều khiển.signal});

Bây giờ hãy tìm nạp tín hiệu. ●

Bước 3: Để hủy bỏ, gọi bộ điều khiển.abort (): bộ điều khiển.abort ();

Chúng tôi đã hoàn thành: Tìm nạp sự kiện từ tín hiệu và hủy bỏ yêu cầu. Khi một tìm nạp bị hủy bỏ, lời hứa của nó sẽ từ chối với một lỗi có tên ABURTROR, vì vậy chúng ta nên xử lý nó:

// hủy bỏ trong 1 giây LET điều khiển = new AbortControll (); setTimeout (() => bộ điều khiển.abort (), 1000); thử {let respession = Await fetch ('/artical/fetch-abort/demo/hang', {tín hiệu: bộ điều khiển.signal}); } Catch (err) {if (err.name == 'aborterror') {// xử lý hủy bỏ () cảnh báo ("bị hủy bỏ!"); } khác {ném err; }}

AbortControll có khả năng mở rộng, nó cho phép hủy nhiều nạp cùng một lúc. Chẳng hạn, ở đây chúng tôi tìm nạp nhiều URL song song và bộ điều khiển hủy bỏ tất cả:

Đặt urls = [...]; // Danh sách các URL để tìm nạp song song Let Trình điều khiển = new AbortControll (); Đặt fetchjobs = urls.map (url => fetch (url, {tín hiệu: bộ điều khiển.signal})); hãy để kết quả = Await Promise.all (fetchjobs); // Từ nơi khác: // Trình điều khiển.abort () dừng tất cả các tìm nạp

Nếu chúng ta có công việc riêng, khác với Fetch, chúng ta có thể sử dụng một abortcontroll duy nhất để ngăn chặn những người đó, cùng với các Fetches. Đặt urls = [...]; Đặt bộ điều khiển = new AbortControll (); Let ourJob = new Promise ((giải quyết, từ chối) => {... bộ điều khiển.signal.addeventlistener ('abort', từ chối);}); Đặt fetchjobs = urls.map (url => fetch (url, {tín hiệu: bộ điều khiển.signal})); hãy để kết quả = Await Promise.all ([... fetchjobs, ourjob]); // Từ nơi khác: // Trình điều khiển.abort () dừng tất cả các Fetches và Ourjob

Tìm nạp: Yêu cầu có nguồn gốc chéo nếu chúng ta thực hiện một phần từ từ trang web tùy ý, điều đó có thể sẽ thất bại. Khái niệm cốt lõi ở đây là nguồn gốc - bộ ba miền/cổng/giao thức. Các yêu cầu có nguồn gốc chéo-những người được gửi đến một miền khác (thậm chí là một tên miền phụ) hoặc giao thức hoặc cổng-yêu cầu các tiêu đề đặc biệt từ phía từ xa. Chính sách đó được gọi là CORS CORS: Chia sẻ tài nguyên có nguồn gốc từ chéo. Chẳng hạn, hãy để thử tìm nạp http://example.com: thử {Await fetch ('http://example.com');

} Catch (err) {alert (err); // Không thể tìm nạp }

Fetch thất bại, như mong đợi.

Tại sao? Một lịch sử ngắn gọn bởi vì các hạn chế có nguồn gốc chéo bảo vệ Internet khỏi các tin tặc xấu xa. Nghiêm túc. Hãy để Lừa làm cho một cuộc lạc đề lịch sử rất ngắn gọn. Trong nhiều năm, một kịch bản từ một trang web không thể truy cập nội dung của một trang web khác. Quy tắc đơn giản nhưng mạnh mẽ đó là một nền tảng của bảo mật Internet. Ví dụ. Một tập lệnh từ trang hacker.com không thể truy cập hộp thư của người dùng tại gmail.com. Mọi người cảm thấy an toàn. JavaScript cũng không có bất kỳ phương pháp đặc biệt nào để thực hiện các yêu cầu mạng tại thời điểm đó. Đó là một ngôn ngữ đồ chơi để trang trí một trang web. Nhưng các nhà phát triển web yêu cầu nhiều quyền lực hơn. Một loạt các thủ thuật đã được phát minh để làm việc xung quanh giới hạn.

Sử dụng các biểu mẫu Một cách để giao tiếp với một máy chủ khác là gửi một ở đó. Mọi người đã gửi nó vào, chỉ để ở trên trang hiện tại, như thế này:

...

Vì vậy, có thể thực hiện yêu cầu GET/POST cho một trang web khác, ngay cả khi không có các phương thức kết nối mạng. Nhưng vì nó bị cấm truy cập vào nội dung của một từ một trang web khác, nên không thể đọc phản hồi. Như chúng ta có thể thấy, các biểu mẫu được phép gửi dữ liệu ở bất cứ đâu, nhưng không nhận được phản hồi. Nói chính xác, có những thủ thuật thực sự cho điều đó (yêu cầu các kịch bản đặc biệt ở cả iframe và trang), nhưng hãy để những con khủng long này yên nghỉ.

Sử dụng tập lệnh Một thủ thuật khác là sử dụng

Biểu mẫu được gửi với mã hóa dữ liệu đa dạng/hình thức. Hoặc, nếu chúng ta thích JSON hơn, thì JSON.Stringify và gửi dưới dạng chuỗi. Chỉ cần không quên đặt loại nội dung tiêu đề: Ứng dụng/JSON, nhiều khung hình phía máy chủ tự động giải mã JSON với nó:

Đặt xhr = new xmlhttprequest (); Hãy để json = json.Stringify ({name: "John", họ: "Smith"}); xhr.open ("post", '/gửi') xhr.setRequestHeader ('loại nội dung', 'application/json; charet = utf-8'); XHR.SEND (JSON);

Phương pháp .Send (cơ thể) là khá ăn tạp. Nó có thể gửi hầu hết mọi thứ, bao gồm các đối tượng Blob và Buffersource.

Tải lên sự kiện tiến độ chỉ hoạt động trên giai đoạn tải xuống. Đó là: Nếu chúng tôi đăng một cái gì đó, XMLHTTPREQUEST lần đầu tiên tải lên dữ liệu của chúng tôi (thân yêu cầu), sau đó tải xuống phản hồi. Nếu chúng tôi tải lên một cái gì đó lớn, thì chúng tôi chắc chắn sẽ quan tâm nhiều hơn đến việc theo dõi tiến trình tải lên. Nhưng xhr.onprotress không giúp đỡ ở đây. Có một đối tượng khác XHR.upload, không có phương thức, dành riêng cho các sự kiện tải lên. Danh sách sự kiện tương tự như các sự kiện XHR, nhưng xhr.upload kích hoạt chúng khi tải lên: ●

LoadStart - Tải lên bắt đầu.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Tải - Tải lên hoàn thành thành công.

Thời gian chờ - Tải lên thời gian ra (nếu thuộc tính thời gian chờ được đặt).

Loadend - Tải lên kết thúc với thành công hoặc lỗi.

Ví dụ về người xử lý:

xhr.upload.onProTHER = function (event) {alert (`Được tải lên $ {event.loaded} của $ {event.total} byte`); }; xhr.upload.onload = function () {alert (`Tải lên đã hoàn thành thành công.`); }; xhr.upload.onerror = function () {alert (`lỗi Trong quá trình tải lên: $ {xhr.status}`); };

Ở đây, một ví dụ thực tế: Tải lên tệp với chỉ báo tiến trình:

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Sự kiện tiến bộ không hữu ích để tiếp tục tải lên, chúng ta cần biết có bao nhiêu được tải lên cho đến khi kết nối bị mất. Có XHR.upload.onprotress để theo dõi tiến trình tải lên. Thật không may, nó vô dụng ở đây, vì nó kích hoạt khi dữ liệu được gửi, nhưng nó có nhận được bởi máy chủ không? Trình duyệt không biết. Có thể nó được đệm bởi một proxy mạng cục bộ, hoặc có thể quy trình máy chủ từ xa đã chết và không thể xử lý chúng, hoặc nó chỉ bị mất ở giữa khi kết nối bị hỏng, và didn tiếp cận với máy thu. Vì vậy, sự kiện này chỉ hữu ích để hiển thị một thanh tiến bộ tốt đẹp. Để tiếp tục tải lên, chúng ta cần biết chính xác số lượng byte nhận được bởi máy chủ. Và chỉ có máy chủ có thể nói điều đó.

Thuật toán 1. Đầu tiên, chúng tôi tạo ID tệp, để xác định duy nhất tệp mà chúng tôi tải lên, ví dụ:

Đặt fileId = file.name + '-' + file.size + '-' + + file.LastModifiedDate;

Điều đó cần thiết để tải lên sơ yếu lý lịch, để nói với máy chủ những gì chúng tôi tiếp tục. 2. Gửi yêu cầu đến máy chủ, hỏi nó đã có bao nhiêu byte, như thế này:

let anprwain = Await fetch ('status', {tiêu đề: {'x-file-id': fileId}});

// Máy chủ có nhiều byte cho phép startbyte = +đang chờ phản hồi.text ();

Điều này giả định rằng máy chủ theo dõi tệp tải lên bằng tiêu đề ID-File-ID. Nên được thực hiện ở phía máy chủ. 3. Sau đó, chúng ta có thể sử dụng lát Blob Phương thức để gửi tệp từ StartByte: XHR.open ("Post", "Tải lên", Đúng); // Gửi ID tệp, để máy chủ biết tệp nào để tiếp tục XHR.SetRequestHeader ('X-File-id', FileID); // Gửi byte mà chúng tôi đang tiếp tục, vì vậy máy chủ biết rằng chúng tôi đang tiếp tục XHR.SetRequestHeader ('X-Start-Byte', StartByte); xhr.upload.onProTHER = (e) => {console.log (`Đã tải lên $ {startByte + e.Aloaded} của $ {startByte + e.total}`); }; // Tệp có thể là từ input.files [0] hoặc một nguồn khác xhr.send (file.slice (startbyte));

Ở đây chúng tôi gửi cho máy chủ cả ID tệp dưới dạng x-file-id, vì vậy nó biết tệp nào chúng tôi đang tải lên và byte bắt đầu là X-start-byte, vì vậy nó biết chúng tôi không tải lên ban đầu, nhưng lại tiếp tục. Máy chủ nên kiểm tra các bản ghi của nó và nếu có tải lên tệp đó và kích thước được tải lên hiện tại chính xác là x-start-byte, thì hãy nối dữ liệu vào nó. Tại đây, bản demo với cả mã máy khách và máy chủ, được viết trên Node.js. Nó chỉ hoạt động một phần trên trang web này, vì Node.js đứng sau một máy chủ khác có tên Nginx, các bộ đệm tải lên, chuyển chúng đến Node.js khi hoàn thành hoàn toàn. Nhưng bạn có thể tải xuống và chạy cục bộ để trình diễn đầy đủ: https://plnkr.co/edit/uwihsrek1zb1nhjxdjc9?p=preview

Như bạn có thể thấy, các phương thức mạng hiện đại gần với các trình quản lý tệp trong khả năng của họ - kiểm soát các tiêu đề, chỉ báo tiến trình, gửi các phần tệp, v.v.

Bỏ phiếu dài cuộc bỏ phiếu dài là cách đơn giản nhất để có kết nối liên tục với máy chủ, điều đó không sử dụng bất kỳ giao thức cụ thể nào như WebSocket hoặc các sự kiện phía máy chủ. Rất dễ thực hiện, nó cũng đủ tốt trong rất nhiều trường hợp.

Bỏ phiếu thường xuyên Cách đơn giản nhất để có được thông tin mới từ máy chủ là bỏ phiếu. Đó là, các yêu cầu định kỳ đến máy chủ: Xin chào, tôi ở đây, bạn có bất kỳ thông tin nào cho tôi không? Ví dụ, một lần trong 10 giây. Đáp lại, máy chủ trước tiên hãy thông báo rằng máy khách đang trực tuyến và thứ hai - gửi một gói tin nhắn mà nó nhận được cho đến thời điểm đó. Điều đó hoạt động, nhưng có những nhược điểm: 1. Tin nhắn được truyền với độ trễ lên đến 10 giây. 2. Ngay cả khi không có tin nhắn, máy chủ được ném bom với các yêu cầu cứ sau 10 giây. Đó là một tải khá để xử lý cho phụ trợ, nói về hiệu suất khôn ngoan. Vì vậy, nếu chúng tôi nói về một dịch vụ rất nhỏ, cách tiếp cận có thể khả thi. Nhưng nói chung, nó cần một sự cải thiện.

Bỏ phiếu lâu dài - là một cách tốt hơn để bỏ phiếu cho máy chủ. Nó cũng rất dễ thực hiện và cung cấp tin nhắn mà không bị chậm trễ. Lưu lượng: 1. Một yêu cầu được gửi đến máy chủ. 2. Máy chủ không đóng kết nối cho đến khi nó có tin nhắn. 3. Khi một thông báo xuất hiện - máy chủ phản hồi yêu cầu với dữ liệu. 4. Trình duyệt thực hiện một yêu cầu mới ngay lập tức. Tình huống khi trình duyệt gửi yêu cầu và có kết nối đang chờ xử lý với máy chủ, là tiêu chuẩn cho phương thức này. Chỉ khi một tin nhắn được gửi, kết nối được thiết lập lại.

Ngay cả khi kết nối bị mất, vì, nói, một lỗi mạng, trình duyệt ngay lập tức gửi một yêu cầu mới. Bản phác thảo mã phía máy khách:

Hàm async Đăng ký () {let respession = Await fetch ("/đăng ký"); if (respons.status == 502) {// Thời gian chờ kết nối, xảy ra khi kết nối đang chờ xử lý quá dài // hãy kết nối lại đang chờ đăng ký (); } other if (respession.status! = 200) {// hiển thị lỗi showMessage (respession.statustext); // Kết nối lại trong một giây chờ đợi lời hứa mới (resolve => setTimeout (resolve, 1000)); đang chờ đăng ký (); } other {// có tin nhắn LET tin nhắn = đang chờ phản hồi.text (); showmessage (tin nhắn); đang chờ đăng ký (); } } đặt mua();

Hàm đăng ký () tạo ra một lần tìm nạp, sau đó chờ phản hồi, xử lý nó và tự gọi lại.

Máy chủ sẽ ổn với nhiều kết nối đang chờ xử lý

Kiến trúc máy chủ phải có khả năng làm việc với nhiều kết nối đang chờ xử lý. Một số kiến ​​trúc máy chủ chạy một quá trình trên mỗi kết nối. Đối với nhiều kết nối sẽ có nhiều quy trình và mỗi quá trình mất rất nhiều bộ nhớ. Vì vậy, nhiều kết nối chỉ tiêu thụ tất cả. Đó thường là trường hợp cho các phụ trợ được viết bằng Php, ngôn ngữ Ruby, nhưng về mặt kỹ thuật không phải là một ngôn ngữ, mà là vấn đề thực hiện. Các phụ trợ được viết bằng Node.js thường không có vấn đề như vậy.

Bản demo: Một cuộc trò chuyện ở đây, một bản demo: https://plnkr.co/edit/p0vxeg5miwpxpjq7lwdr?p=preview

Khu vực sử dụng bỏ phiếu dài hoạt động tuyệt vời trong các tình huống khi tin nhắn rất hiếm. Nếu các tin nhắn đến rất thường xuyên, thì biểu đồ yêu cầu các tin nhắn nhận được, được vẽ ở trên, trở nên giống như cưa. Mỗi tin nhắn là một yêu cầu riêng biệt, được cung cấp với các tiêu đề, chi phí xác thực, v.v. Vì vậy, trong trường hợp này, một phương thức khác được ưa thích, chẳng hạn như WebSocket hoặc máy chủ đã gửi các sự kiện.

WebSocket Giao thức WebSocket, được mô tả trong đặc tả RFC 6455  cung cấp một cách để trao đổi dữ liệu giữa trình duyệt và máy chủ thông qua kết nối liên tục. Khi kết nối WebSocket được thiết lập, cả máy khách và máy chủ có thể gửi dữ liệu cho nhau. WebSocket đặc biệt tuyệt vời cho các dịch vụ yêu cầu trao đổi dữ liệu liên tục, ví dụ: Trò chơi trực tuyến, hệ thống giao dịch thời gian thực, như vậy.

Một ví dụ đơn giản để mở kết nối WebSocket, chúng ta cần tạo WebSocket mới bằng giao thức đặc biệt WS trong URL: LET SOCKET = new WebSocket ("WS: //javascript.info");

Ngoài ra còn có giao thức WSS: // được mã hóa. Nó giống như HTTPS cho WebSockets.

Luôn thích WSS: //

WSS: // Giao thức không chỉ được mã hóa mà còn đáng tin cậy hơn. Điều đó bởi vì dữ liệu WS: // không được mã hóa, có thể nhìn thấy cho bất kỳ trung gian nào. Các máy chủ proxy cũ không biết về WebSocket, họ có thể thấy các tiêu đề kỳ lạ của người Hồi giáo và hủy bỏ kết nối. Mặt khác, WSS: // là WebSocket qua TLS, (giống như HTTPS là HTTP trên TLS), lớp bảo mật vận chuyển mã hóa dữ liệu tại người gửi và giải mã tại máy thu, do đó nó được mã hóa thông qua các prox. Họ có thể nhìn thấy những gì bên trong và để nó qua.

Khi ổ cắm được tạo, chúng ta nên nghe các sự kiện trên đó. Có hoàn toàn 4 sự kiện: ●

Mở - Kết nối được thiết lập,

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

Và nếu chúng tôi muốn gửi một cái gì đó, thì socket.send (dữ liệu) sẽ làm điều đó. Đây là một ví dụ:

Đặt socket = new WebSocket ("WSS: //javascript.info/article/websocket/demo/hello"); socket.onopen = function (e) {alert ("[open] kết nối được thiết lập, gửi -> server"); Socket.Send ("Tên tôi là John"); }; socket.onmessage = function (event) {alert (`[message] dữ liệu nhận được: $ {event.data} {// event.data là một chuỗi (nếu văn bản) hoặc mảng

Tỷ lệ giới hạn Tưởng tượng, ứng dụng của chúng tôi đang tạo ra rất nhiều dữ liệu để gửi. Nhưng người dùng có kết nối mạng chậm, có thể trên điện thoại di động, bên ngoài một thành phố. Chúng ta có thể gọi socket.send (dữ liệu) nhiều lần. Nhưng dữ liệu sẽ được đệm (lưu trữ) trong bộ nhớ và chỉ được gửi nhanh như tốc độ mạng cho phép. Các thuộc tính của ổ cắm.bufferedamount lưu trữ số lượng byte được đệm tại thời điểm này, chờ được gửi qua mạng. Chúng tôi có thể kiểm tra nó để xem liệu ổ cắm có thực sự có sẵn để truyền hay không.

. , 100);

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

Và nếu chúng tôi muốn gửi một cái gì đó, thì socket.send (dữ liệu) sẽ làm điều đó. Đây là một ví dụ:

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

1009 - Thông điệp quá lớn để xử lý,

1011 - Lỗi không mong muốn trên máy chủ,

…và như thế.

Vui lòng tham khảo RFC6455, §7.4.1

cho danh sách đầy đủ.

Mã WebSocket có phần giống như mã HTTP, nhưng khác nhau. Cụ thể, bất kỳ mã nào dưới 1000 đều được bảo lưu, sẽ có một lỗi nếu chúng tôi cố gắng đặt mã đó. // Trong trường hợp kết nối bị hỏng socket.onclose = event => {// event.code === 1006 // event.reason === "" // event.wasclean === false (không có khung đóng)};

Trạng thái kết nối để có trạng thái kết nối, ngoài ra còn có thuộc tính ổ cắm.

0 - kết nối ": kết nối chưa được thiết lập,

1 - “Mở”: Giao tiếp,

2 - “đóng cửa”: kết nối đang kết thúc,

3 - Đóng khép kín: Kết nối được đóng lại.

Ví dụ trò chuyện Hãy để xem xét một ví dụ trò chuyện bằng cách sử dụng API WebSocket và Node.js WebSocket mô -đun https://github.com/websockets/ws. HTML: Có một để gửi tin nhắn và một tin nhắn đến:

JavaScript cũng đơn giản. Chúng tôi mở một ổ cắm, sau đó gửi biểu mẫu - Socket.Send (tin nhắn), trên tin nhắn đến - nối nó vào div#message: hãy để socket = new WebSocket ("WSS: //javascript.info/article/websocket/chat/ws "); // Gửi tin nhắn từ tài liệu biểu mẫu.forms.publish.onsubmit = function () {let outguidMessage = this.message.value; Ổ cắm.send (OffidingMessage); trả lại sai; }; // Hiển thị tin nhắn trong div#message socket.onmessage = function (event) {let tin nhắn = event.data; Đặt messageLem = document.createEement ('div'); messageLem.TextContent = message; document.getEuityById ('tin nhắn'). prepend (messageLem); }

Mã phía máy chủ là một chút ngoài phạm vi của chúng tôi ở đây. Chúng tôi sử dụng API WebSocket trình duyệt, một máy chủ có thể có một thư viện khác. Tuy nhiên, nó cũng có thể khá đơn giản. Chúng tôi sẽ sử dụng Node.js với https://github.com/websockets/ws  Mô -đun cho WebSockets.

Thuật toán phía máy chủ sẽ là: 1. Tạo khách hàng = new set ()-một bộ ổ cắm. 2 3. Khi một tin nhắn nhận được: Lặp lại khách hàng và gửi nó cho mọi người. 4. Khi kết nối được đóng: client.delete (ổ cắm). const ws = yêu cầu mới ('ws'); const wss = new Ws.server ({noserver: true}); const client = new set (); http.createserver ((req, res) => {// Ở đây chúng tôi chỉ xử lý các kết nối websocket // trong dự án thực sự, chúng tôi sẽ có một số mã khác herre để xử lý yêu cầu không websocket .alloc (0), onsocketConnect);}); hàm onSocketConnect (ws) {client.add (ws); ws.on ('message', function (message) {message = message.slice (0, 50); // Độ dài tin nhắn tối đa sẽ là 50 cho (hãy để khách hàng của máy khách) {client.send (tin nhắn);}}) ; ws.on ('Đóng', function () {client.delete (ws);}); }

Đây là ví dụ làm việc: Gửi

Bạn cũng có thể tải xuống nó (nút trên bên phải trong iframe) và chạy cục bộ. Chỉ cần không quên cài đặt Node.js và NPM Cài đặt WS trước khi chạy.

Bản tóm tắt

WebSocket là một cách hiện đại để có các kết nối máy chủ trình duyệt liên tục. ●

WebSockets don lồng có những hạn chế về nguồn gốc chéo.

Chúng được hỗ trợ tốt trong trình duyệt.

Có thể gửi/nhận chuỗi và dữ liệu nhị phân.

API rất đơn giản. Phương pháp: ●

socket.send (dữ liệu),

Ổ cắm.close ([CODE], [Lý do]).

Sự kiện: ●

mở ,

thông điệp ,

lỗi ,

gần .

WebSocket tự nó không bao gồm kết nối lại, xác thực và nhiều cơ chế cấp cao khác. Vì vậy, có các thư viện máy khách/máy chủ cho điều đó và nó cũng có thể thực hiện các khả năng này theo cách thủ công. Đôi khi, để tích hợp WebSocket vào dự án hiện có, mọi người chạy WebSocket Server song song với máy chủ HTTP chính và họ chia sẻ một cơ sở dữ liệu duy nhất. Yêu cầu để WebSocket Sử dụng WSS: //ws.site.com, một tên miền phụ dẫn đến máy chủ WebSocket, trong khi https://site.com đi đến http-server chính. Chắc chắn, những cách tích hợp khác cũng có thể. Nhiều máy chủ (như Node.js) có thể hỗ trợ cả giao thức HTTP và WebSocket.

Máy chủ đã gửi các sự kiện về các sự kiện server-sent  Thông số kỹ thuật mô tả một sự kiện lớp học tích hợp, giữ kết nối với máy chủ và cho phép nhận các sự kiện từ nó. Tương tự như WebSocket, kết nối là dai dẳng. Nhưng có một số khác biệt quan trọng: WebSocket

Sự kiện

Bi-Directional: Cả máy khách và máy chủ đều có thể trao đổi tin nhắn

Một chiều: Chỉ máy chủ gửi dữ liệu

Dữ liệu nhị phân và văn bản

Chỉ văn bản

Giao thức WebSocket

HTTP thường xuyên

Eventsource là một cách giao tiếp ít mạnh mẽ hơn với máy chủ hơn WebSocket. Tại sao một người nên sử dụng nó? Lý do chính: nó đơn giản hơn. Trong nhiều ứng dụng, sức mạnh của WebSocket hơi quá nhiều. Chúng ta cần nhận một luồng dữ liệu từ máy chủ: có thể tin nhắn trò chuyện hoặc giá thị trường hoặc bất cứ điều gì. Đó là những gì mà sự kiện là giỏi. Ngoài ra, nó hỗ trợ Autoreconnect, một cái gì đó chúng ta cần thực hiện thủ công với WebSocket. Bên cạnh đó, nó là một HTTP cũ đơn giản, không phải là một giao thức mới.

Nhận tin nhắn để bắt đầu nhận tin nhắn, chúng tôi chỉ cần tạo sự kiện mới (URL). Trình duyệt sẽ kết nối với URL và giữ cho kết nối mở, chờ đợi các sự kiện. Máy chủ cần phản hồi với Status 200 và loại nội dung tiêu đề: luồng văn bản/sự kiện, sau đó giữ kết nối và ghi tin nhắn vào nó ở định dạng đặc biệt, như thế này:

Dữ liệu: Tin nhắn 1 Dữ liệu: Tin nhắn 2 Dữ liệu: Tin nhắn 3 Dữ liệu: của hai dòng

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Tin nhắn được phân định với các đường đứt đường đôi \ n \ n.

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: (tin nhắn thứ 3 ở trên).

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ("/sự kiện/đăng ký"); sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ('Tin nhắn', ...)

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ("https://another-site.com/events");

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Đặt nguồn = sự kiện mới ("https://another-site.com/events", {withcredentials: true});

Vui lòng xem chương tìm nạp: Yêu cầu có nguồn gốc chéo để biết thêm chi tiết về các tiêu đề Crossdomain.

Kết nối lại khi tạo, sự kiện mới kết nối với máy chủ và nếu kết nối bị hỏng - kết nối lại. Điều đó rất thuận tiện, vì chúng tôi không phải quan tâm đến nó. Có một độ trễ nhỏ giữa các kết nối lại, một vài giây theo mặc định. Máy chủ có thể đặt độ trễ được đề xuất bằng cách sử dụng thử lại: phản hồi (tính bằng mili giây):

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Tin nhắn được phân định với các đường đứt đường đôi \ n \ n.

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: (tin nhắn thứ 3 ở trên).

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ("/sự kiện/đăng ký"); sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ('Tin nhắn', ...)

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ("https://another-site.com/events");

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: (tin nhắn thứ 3 ở trên).

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ("/sự kiện/đăng ký"); sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ('Tin nhắn', ...)

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ("https://another-site.com/events");

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Đặt nguồn = sự kiện mới ("https://another-site.com/events", {withcredentials: true});

Vui lòng xem chương tìm nạp: Yêu cầu có nguồn gốc chéo để biết thêm chi tiết về các tiêu đề Crossdomain.

Kết nối lại khi tạo, sự kiện mới kết nối với máy chủ và nếu kết nối bị hỏng - kết nối lại. Điều đó rất thuận tiện, vì chúng tôi không phải quan tâm đến nó. Có một độ trễ nhỏ giữa các kết nối lại, một vài giây theo mặc định. Máy chủ có thể đặt độ trễ được đề xuất bằng cách sử dụng thử lại: phản hồi (tính bằng mili giây):

Thử lại: 15000 Dữ liệu: Xin chào, tôi đặt độ trễ kết nối lại thành 15 giây

Việc thử lại: có thể đến cả hai cùng với một số dữ liệu hoặc là một thông điệp độc lập. Trình duyệt nên chờ đợi nhiều trước khi kết nối lại. Nếu kết nối mạng bị mất, trình duyệt có thể đợi cho đến khi nó được khôi phục, và sau đó thử lại. ●

Ví dụ đầy đủ ở đây, máy chủ gửi tin nhắn có 1, 2, 3, sau đó tạm biệt và phá vỡ kết nối. Sau đó trình duyệt tự động kết nối lại. https://plnkr.co/edit/lmodpfhjdd3yirrghksf?p=preview

Tóm tắt đối tượng Truyền thông của Eventsource với máy chủ. Nó thiết lập một kết nối liên tục và cho phép máy chủ gửi tin nhắn qua nó. Nó cung cấp: ●

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Điều đó làm cho Eventsource trở thành một sự thay thế khả thi cho WebSocket, vì nó Low Lowlevel hơn và thiếu các tính năng này. Trong nhiều ứng dụng thực tế, sức mạnh của sự kiện là vừa đủ. Được hỗ trợ trong tất cả các trình duyệt hiện đại (không phải IE). Cú pháp là:

Đặt nguồn = sự kiện mới (url, [thông tin xác thực]);

Đối số thứ hai chỉ có một tùy chọn có thể: {withcredentials: true}, nó cho phép gửi thông tin đăng nhập từ miền chéo. Tổng thể bảo mật miền chéo cũng giống như đối với các phương thức tìm nạp và các phương thức mạng khác.

Thuộc tính của một đối tượng OVENTOURCE RADERSTATE Trạng thái kết nối hiện tại: hoặc ESTENSOURCE.CONNECTING (= 0), eventource.open (= 1) hoặc eventource.closed (= 2). LastEventid id nhận được cuối cùng. Khi kết nối lại, trình duyệt gửi nó trong tiêu đề LastEvent-id.

Các phương thức đóng () đóng kết nối kết nối.

Thông báo sự kiện nhận được, dữ liệu nằm trong event.data. Mở kết nối được thiết lập. Lỗi trong trường hợp có lỗi, bao gồm cả kết nối bị mất (sẽ tự động kết nối lại) và lỗi gây tử vong. Chúng tôi có thể kiểm tra ReadyState để xem liệu kết nối lại có được thử không. Máy chủ có thể đặt một tên sự kiện tùy chỉnh trong sự kiện:. Những sự kiện như vậy nên được xử lý bằng cách sử dụng AddEventListener, không BẬT.

Định dạng phản hồi máy chủ Máy chủ gửi tin nhắn, được phân định bởi \ n \ n. Các bộ phận tin nhắn có thể bắt đầu bằng: ●

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Điều đó làm cho Eventsource trở thành một sự thay thế khả thi cho WebSocket, vì nó Low Lowlevel hơn và thiếu các tính năng này. Trong nhiều ứng dụng thực tế, sức mạnh của sự kiện là vừa đủ. Được hỗ trợ trong tất cả các trình duyệt hiện đại (không phải IE). Cú pháp là:

Đặt nguồn = sự kiện mới (url, [thông tin xác thực]);

Đối số thứ hai chỉ có một tùy chọn có thể: {withcredentials: true}, nó cho phép gửi thông tin đăng nhập từ miền chéo. Tổng thể bảo mật miền chéo cũng giống như đối với các phương thức tìm nạp và các phương thức mạng khác.

Thuộc tính của một đối tượng OVENTOURCE RADERSTATE Trạng thái kết nối hiện tại: hoặc ESTENSOURCE.CONNECTING (= 0), eventource.open (= 1) hoặc eventource.closed (= 2). LastEventid id nhận được cuối cùng. Khi kết nối lại, trình duyệt gửi nó trong tiêu đề LastEvent-id.

Các phương thức đóng () đóng kết nối kết nối.

Thông báo sự kiện nhận được, dữ liệu nằm trong event.data. Mở kết nối được thiết lập. Lỗi trong trường hợp có lỗi, bao gồm cả kết nối bị mất (sẽ tự động kết nối lại) và lỗi gây tử vong. Chúng tôi có thể kiểm tra ReadyState để xem liệu kết nối lại có được thử không. Máy chủ có thể đặt một tên sự kiện tùy chỉnh trong sự kiện:. Những sự kiện như vậy nên được xử lý bằng cách sử dụng AddEventListener, không BẬT.

Định dạng phản hồi máy chủ Máy chủ gửi tin nhắn, được phân định bởi \ n \ n. Các bộ phận tin nhắn có thể bắt đầu bằng: ●

Giới hạn

Có một vài hạn chế: ●

Tên = cặp giá trị, sau khi mã hóa, không được vượt quá 4kb. Vì vậy, chúng tôi có thể lưu trữ bất cứ thứ gì lớn trong cookie. Tổng số cookie trên mỗi miền được giới hạn ở khoảng 20+, giới hạn chính xác phụ thuộc vào trình duyệt.

Cookie có một số tùy chọn, nhiều trong số chúng rất quan trọng và nên được thiết lập. Các tùy chọn được liệt kê sau khóa = giá trị, được phân định bởi; , như thế này: document.cookie = "user = john; path =/; hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT"

đường dẫn

Tên = cặp giá trị, sau khi mã hóa, không được vượt quá 4kb. Vì vậy, chúng tôi có thể lưu trữ bất cứ thứ gì lớn trong cookie. Tổng số cookie trên mỗi miền được giới hạn ở khoảng 20+, giới hạn chính xác phụ thuộc vào trình duyệt.

Cookie có một số tùy chọn, nhiều trong số chúng rất quan trọng và nên được thiết lập. Các tùy chọn được liệt kê sau khóa = giá trị, được phân định bởi; , như thế này: document.cookie = "user = john; path =/; hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT"

đường dẫn

đường dẫn =/mypath

Tiền tố đường dẫn URL, cookie sẽ có thể truy cập được cho các trang dưới đường dẫn đó. Phải là tuyệt đối. Theo mặc định, nó là đường dẫn hiện tại. Nếu cookie được đặt với Path = /admin, thì nó có thể nhìn thấy tại các trang /quản trị viên và /quản trị viên /một cái gì đó, nhưng không phải tại /home hoặc /adminpage. Thông thường, chúng ta nên đặt đường dẫn đến gốc: đường dẫn =/ để làm cho cookie có thể truy cập được từ tất cả các trang trang web.

Miền ●

Domain = site.com

Một miền mà cookie có thể truy cập được. Trong thực tế mặc dù, có những hạn chế. Chúng tôi có thể thiết lập bất kỳ miền nào. Theo mặc định, một cookie chỉ có thể truy cập tại miền đặt nó. Vì vậy, nếu cookie được đặt bởi Site.com, chúng tôi đã giành được nó. Nhưng những gì mà khó khăn hơn, chúng tôi cũng đã giành được cookie tại một diễn đàn phụ .site.com! // tại trang web.com document.cookie = "user = john" // tại forum.site.com ALERT (document.cookie); // Không có người dùng

Không có cách nào để cho một cookie có thể truy cập từ tên miền cấp 2 khác, vì vậy khác.com sẽ không bao giờ nhận được một bộ cookie tại Site.com. Đó là một hạn chế an toàn, để cho phép chúng tôi lưu trữ dữ liệu nhạy cảm trong cookie, chỉ có sẵn trên một trang web. Nhưng nếu chúng tôi muốn cho phép các tên miền phụ như Forum.site.com có ​​được cookie, thì điều đó có thể. Khi đặt cookie tại site.com, chúng ta nên đặt tùy chọn miền một cách rõ ràng thành tên miền gốc: domain = site.com: // at site.com // Làm cho cookie có thể truy cập trên bất kỳ tên miền phụ nào *.site.com: document.cookie = "user = john; domain = site.com" // sau

// tại Forum.site.com Cảnh báo (Document.cookie); // Có người dùng cookie = John

Vì lý do lịch sử, domain = .site.com (một dấu chấm trước trang.com) cũng hoạt động theo cùng một cách, cho phép truy cập vào cookie từ các tên miền phụ. Đó là một ký hiệu cũ, nên được sử dụng nếu chúng ta cần hỗ trợ các trình duyệt rất cũ. Vì vậy, tùy chọn miền cho phép làm cho một cookie có thể truy cập tại các tên miền phụ.

Hết hạn, theo mặc định, nếu một cookie không có một trong những tùy chọn này, nó sẽ biến mất khi trình duyệt bị đóng. Những cookie như vậy được gọi là cookie phiên của phiên bản, để cho cookie tồn tại trong trình duyệt đóng, chúng ta có thể đặt tùy chọn hết hạn hoặc độ tuổi tối đa. ●

hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT

Ngày hết hạn cookie, khi trình duyệt sẽ tự động xóa nó. Ngày phải chính xác ở định dạng này, trong gmt múi giờ. Chúng ta có thể sử dụng Date.ToutCString để có được nó. Chẳng hạn, chúng ta có thể đặt cookie hết hạn sau 1 ngày:

. date = date.toutcString (); document.cookie = "user = john; hết hạn =" + ngày;

Nếu chúng ta đặt hết hạn đến một ngày trong quá khứ, cookie sẽ bị xóa. ●

Max-Age = 3600

Một giải pháp thay thế để hết hạn, chỉ định hết hạn cookie trong vài giây kể từ thời điểm hiện tại. Nếu không hoặc âm, thì cookie sẽ bị xóa:

// cookie sẽ chết +1 giờ kể từ bây giờ tài liệu.cookie = "user = john; max-age = 3600"; // Xóa cookie (hãy để nó hết hạn ngay bây giờ) tài liệu.cookie = "user = john; max-age = 0";

an toàn ●

chắc chắn

Cookie chỉ nên được chuyển qua HTTPS. Theo mặc định, nếu chúng tôi đặt cookie tại http://site.com, thì nó cũng xuất hiện tại https://site.com và ngược lại. Đó là, cookie dựa trên miền, chúng không phân biệt giữa các giao thức. Với tùy chọn này, nếu cookie được đặt bởi https://site.com, thì nó không xuất hiện khi cùng một trang web được HTTP truy cập, như http://site.com. Vì vậy, nếu một cookie có nội dung nhạy cảm không bao giờ được gửi qua HTTP không được mã hóa, thì cờ là điều đúng.

Rằng gọi là một cuộc tấn công giả mạo yêu cầu chéo (hoặc XSRF). Các ngân hàng thực sự được bảo vệ khỏi nó tất nhiên. Tất cả các biểu mẫu được tạo bởi Bank.com đều có một trường đặc biệt, vì vậy được gọi là mã thông báo bảo vệ XS XSRF, rằng một trang xấu không thể tạo ra, cũng không phải là trích xuất từ ​​một trang từ xa (nó có thể gửi một biểu mẫu ở đó, nhưng không thể nhận được dữ liệu trở lại). Nhưng điều đó cần có thời gian để thực hiện: Chúng tôi cần đảm bảo rằng mọi biểu mẫu đều có trường mã thông báo và chúng tôi cũng phải kiểm tra tất cả các yêu cầu.

Nhập tùy chọn Cookie Samesite Tùy chọn Cookie Samesite cung cấp một cách khác để bảo vệ khỏi các cuộc tấn công đó, theo lý thuyết) không nên yêu cầu các mã thông báo bảo vệ XSRF. Nó có hai giá trị có thể: ●

Samesite = Strict (giống như Samesite không có giá trị)

Một cookie với SameSite = Strict không bao giờ được gửi nếu người dùng đến từ bên ngoài trang web. Nói cách khác, cho dù người dùng theo liên kết từ thư của họ hoặc gửi biểu mẫu từ Evil.com hay bất kỳ hoạt động nào có nguồn gốc từ miền khác, cookie không được gửi. Nếu cookie xác thực có tùy chọn Samesite, thì XSRF Attack không có cơ hội để thành công, bởi vì việc gửi từ Evil.com không có cookie. Vì vậy, Bank.com sẽ không nhận ra người dùng và sẽ không tiến hành thanh toán. Việc bảo vệ khá đáng tin cậy. Chỉ các hoạt động đến từ Bank.com sẽ gửi Cookie SameTeite. Mặc dù, có một sự bất tiện nhỏ. Khi người dùng theo một liên kết hợp pháp đến Bank.com, như từ các ghi chú của chính họ, họ sẽ ngạc nhiên khi Bank.com không nhận ra chúng. Thật vậy, samesite = cookie nghiêm ngặt không được gửi trong trường hợp đó. Chúng tôi có thể làm việc xung quanh điều đó bằng cách sử dụng hai cookie: một cho nhận dạng chung của người dùng, chỉ vì mục đích nói: Hello Hello, John, và một cái khác cho các hoạt động thay đổi dữ liệu với SAMETITE = nghiêm ngặt. Sau đó, một người đến từ bên ngoài trang web sẽ thấy được chào đón, nhưng các khoản thanh toán phải được bắt đầu từ trang web ngân hàng. ●

SAMEMITE = LAX

Một cách tiếp cận thoải mái hơn cũng bảo vệ khỏi XSRF và không phá vỡ trải nghiệm người dùng. Chế độ LAX, giống như nghiêm ngặt, cấm trình duyệt gửi cookie khi đến từ bên ngoài trang web, nhưng thêm một ngoại lệ.

Một cookie samesite = lax được gửi nếu cả hai điều kiện này là đúng: 1. Phương thức HTTP là an toàn (ví dụ: nhận, nhưng không đăng). Danh sách đầy đủ các phương thức HTTP an toàn nằm trong đặc tả RFC7231. Về cơ bản, đây là những phương pháp nên được sử dụng để đọc, nhưng không viết dữ liệu. Họ không được thực hiện bất kỳ hoạt động thay đổi dữ liệu. Theo một liên kết luôn luôn có được, phương pháp an toàn. 2. Hoạt động thực hiện điều hướng cấp cao nhất (thay đổi URL trong thanh địa chỉ trình duyệt). Điều đó thường đúng, nhưng nếu điều hướng được thực hiện trong một, thì nó không phải là cấp cao nhất. Ngoài ra, các yêu cầu AJAX không thực hiện bất kỳ điều hướng nào, do đó chúng không phù hợp. Vì vậy, những gì Samesite = LAX thực hiện về cơ bản cho phép một hoạt động phổ biến nhất đến URL để có cookie. Ví dụ. Mở một liên kết trang web từ các ghi chú thỏa mãn các điều kiện này. Nhưng bất cứ điều gì phức tạp hơn, như yêu cầu AJAX từ một trang web khác hoặc một biểu mẫu gửi đều mất cookie. Nếu điều đó tốt cho bạn, thì việc thêm Samesite = LAX có thể sẽ không phá vỡ trải nghiệm người dùng và thêm bảo vệ. Nhìn chung, Samesite là một lựa chọn tuyệt vời, nhưng nó có một nhược điểm quan trọng: ●

Samesite bị bỏ qua (không được hỗ trợ) bởi các trình duyệt cũ, năm 2017 hoặc lâu hơn.

Vì vậy, nếu chúng tôi chỉ dựa vào Samesite để cung cấp bảo vệ, thì các trình duyệt cũ sẽ dễ bị tổn thương. Nhưng chúng tôi chắc chắn có thể sử dụng Samesite cùng với các biện pháp bảo vệ khác, như mã thông báo XSRF, để thêm một lớp phòng thủ bổ sung và sau đó, trong tương lai, khi các trình duyệt cũ chết, chúng tôi có thể có thể loại bỏ mã thông báo XSRF.

Httponly Tùy chọn này không liên quan gì đến JavaScript, nhưng chúng tôi phải đề cập đến nó để hoàn thiện. Máy chủ web sử dụng tiêu đề Set-Cookie để đặt cookie. Và nó có thể đặt tùy chọn httponly. Tùy chọn này cấm mọi quyền truy cập JavaScript vào cookie. Chúng ta có thể thấy cookie như vậy hoặc thao túng nó bằng Document.cookie. Điều đó được sử dụng như một biện pháp phòng ngừa, để bảo vệ khỏi các cuộc tấn công nhất định khi một hacker tiêm mã JavaScript của riêng mình vào một trang và chờ người dùng truy cập trang đó.

Điều đó không thể có được, một tin tặc không thể đưa mã của họ vào trang web của chúng tôi, nhưng có thể có các lỗi cho phép tin tặc làm điều đó. Thông thường, nếu điều đó xảy ra và người dùng sẽ truy cập trang web với mã hacker, thì mã đó sẽ thực thi và truy cập vào tài liệu.cookie với cookie người dùng có chứa thông tin xác thực. Điều đó thật xấu. Nhưng nếu một cookie là httponly, thì Document.cookie không thấy nó, vì vậy nó được bảo vệ.

Phụ lục: Các chức năng cookie ở đây, một tập hợp nhỏ các chức năng để làm việc với cookie, thuận tiện hơn so với sửa đổi thủ công của tài liệu.cookie. Có nhiều thư viện cookie cho điều đó, vì vậy chúng là cho mục đích demo. Làm việc đầy đủ mặc dù.

GetCookie (tên) Cách ngắn nhất để truy cập cookie là sử dụng biểu thức chính quy. Hàm getcookie (tên) Trả về cookie với tên đã cho: // Trả về cookie với tên đã cho, // hoặc không xác định nếu không tìm thấy chức năng getCookie (tên) {let matches = document.cookie.match (regexp mới (" . + "= ([^;]*)")); Trở lại các trận đấu? Decodeuricomponent (khớp [1]): không xác định; }

Ở đây regexp mới được tạo ra một cách linh hoạt, để phù hợp; Tên =. Xin lưu ý rằng giá trị cookie được mã hóa, vì vậy GetCookie sử dụng hàm giải mã tích hợp để giải mã nó.

setCookie (tên, giá trị, tùy chọn) đặt tên cookie thành giá trị đã cho với đường dẫn =/ theo mặc định (có thể được sửa đổi để thêm các mặc định khác):

hàm setCookie (tên, giá trị, tùy chọn = {}) {tùy chọn = {path: '/', // Thêm các mặc định khác ở đây nếu cần ... tùy chọn};

if (Tùy chọn.Expires.ToutCString) {Tùy chọn.Expires = Tùy chọn.Expires.ToutCString (); } Đặt cập nhậtCookie = encodeUricomponent (name) + "=" + encodeuricomponent (value); for (Đặt tùy chọnKey trong các tùy chọn) {UpdateDcookie + = ";" + tùy chọnKey; Đặt tùy chọnValue = Tùy chọn [OptionKey]; if (Tùy chọnValue! == true) {UpdateDcookie + = "=" + tùy chọnValue; }} document.cookie = UpdateDcookie; } // Ví dụ về việc sử dụng: setCookie ('người dùng', 'john', {an toàn: true, 'max-age': 3600});

Deletecookie (tên) Để xóa cookie, chúng ta có thể gọi nó với ngày hết hạn âm:

hàm Deletecookie (tên) {setCookie (tên, "", {'max -age': -1})}

Cập nhật hoặc xóa phải sử dụng cùng một đường dẫn và miền

Xin lưu ý: Khi chúng tôi cập nhật hoặc xóa cookie, chúng tôi nên sử dụng chính xác cùng một đường dẫn và tùy chọn miền như khi chúng tôi đặt nó. Cùng nhau: Cookie.js.

Phụ lục: Cookie của bên thứ ba Một cookie được gọi là bên thứ ba của bên thứ ba nếu nó được đặt bởi tên miền khác với người dùng đang truy cập. Ví dụ: 1. Một trang tại Site.com tải một biểu ngữ từ một trang web khác:. 2. Cùng với biểu ngữ, máy chủ từ xa tại AD.com có ​​thể đặt tiêu đề Set-Cookie với Cookie như ID = 1234. Cookie như vậy bắt nguồn từ ads.com

Miền và sẽ chỉ hiển thị tại AD.com:

3. Lần tới khi ADS.com được truy cập, máy chủ từ xa sẽ nhận cookie ID và nhận ra người dùng:

4. Điều gì thậm chí còn quan trọng hơn, khi người dùng chuyển từ trang web.com sang một trang khác khác.com cũng có biểu ngữ, sau đó ads.com có ​​cookie, vì nó thuộc về ads.com, do đó nhận ra khách truy cập và theo dõi anh ta Khi anh ấy di chuyển giữa các trang web:

Cookie của bên thứ ba theo truyền thống được sử dụng cho các dịch vụ theo dõi và quảng cáo, do bản chất của chúng. Chúng bị ràng buộc với miền gốc, vì vậy AD.com có ​​thể theo dõi cùng một người dùng giữa các trang web khác nhau, nếu tất cả chúng đều truy cập nó. Đương nhiên, một số người không thích bị theo dõi, vì vậy trình duyệt cho phép vô hiệu hóa các cookie như vậy. Ngoài ra, một số trình duyệt hiện đại sử dụng các chính sách đặc biệt cho các cookie như vậy: ●

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Xin lưu ý:

Nếu chúng ta tải một tập lệnh từ miền của bên thứ ba, như nhấp vào tôi

Có 4 thuộc tính để mô tả quá trình chuyển đổi CSS: ●

chuyển tiếp-tài sản

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Xin lưu ý:

Nếu chúng ta tải một tập lệnh từ miền của bên thứ ba, như nhấp vào tôi

Có 4 thuộc tính để mô tả quá trình chuyển đổi CSS: ●

chuyển tiếp-tài sản

Thời gian chuyển tiếp

Chuyển đổi thời gian chức năng

Transition-Delay

Chúng tôi sẽ bao gồm chúng trong một khoảnh khắc, bây giờ hãy để lưu ý rằng thuộc tính chuyển đổi chung cho phép khai báo chúng cùng nhau theo thứ tự: thời lượng thuộc tính

Độ trễ chức năng thời gian, và cũng làm động nhiều thuộc tính cùng một lúc. Chẳng hạn, nút này hoạt hình cả màu sắc và kích thước phông chữ: Nhấp vào tôi

Thời gian chuyển tiếp

Chuyển đổi thời gian chức năng

Trong ví dụ trên JavaScript thêm lớp. Một phần tử - và hoạt hình bắt đầu:

Stripe.ClassList.Add ('animate');

Chúng ta cũng có thể bắt đầu nó từ giữa giữa, từ con số chính xác, ví dụ: tương ứng với lần thứ hai hiện tại, sử dụng độ trễ chuyển tiếp tiêu cực. Tại đây nếu bạn nhấp vào chữ số - nó bắt đầu hoạt hình từ lần thứ hai hiện tại: https://plnkr.co/edit/zpqja4cejomtapuxpxwe?p=preview

JavaScript thực hiện nó bằng một dòng phụ:

stripe.onclick = function () {let sec = new date (). getSeconds () % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ('animate'); };

Chức năng thời gian chuyển đổi thời gian chuyển đổi mô tả cách quá trình hoạt hình được phân phối theo thời gian. Nó sẽ bắt đầu chậm và sau đó đi nhanh hoặc vise Versa. Đó là tài sản phức tạp nhất từ ​​cái nhìn đầu tiên. Nhưng nó trở nên rất đơn giản nếu chúng ta dành một chút thời gian cho nó. Thuộc tính đó chấp nhận hai loại giá trị: một đường cong hoặc các bước. Hãy để bắt đầu từ đường cong, vì nó sử dụng thường xuyên hơn.

Đường cong Bezier Chức năng thời gian có thể được đặt thành đường cong Bezier với 4 điểm điều khiển thỏa mãn các điều kiện: 1. Điểm điều khiển đầu tiên: (0,0). 2. Điểm kiểm soát cuối cùng: (1,1). 3. Đối với các điểm trung gian, giá trị của x phải nằm trong khoảng 0..1, y có thể là bất cứ điều gì. Cú pháp cho một đường cong bezier trong CSS: hình khối (x2, y2, x3, y3). Ở đây chúng ta cần chỉ định các điểm kiểm soát thứ 2 và thứ 3, vì điểm thứ nhất được cố định (0,0) và điểm thứ 4 là (1,1). Hàm thời gian mô tả quá trình hoạt hình đi nhanh như thế nào. ●

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối (0, 0, 1, 1). Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian (x) trôi qua, sự hoàn thành (y) của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn (nhấp vào nó): https://plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier (0, 0, 1, 1); / * Bộ JavaScript còn lại thành 450px */}

JavaScript thực hiện nó bằng một dòng phụ:

stripe.onclick = function () {let sec = new date (). getSeconds () % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ('animate'); };

JavaScript thực hiện nó bằng một dòng phụ:

stripe.onclick = function () {let sec = new date (). getSeconds () % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ('animate'); };

Chức năng thời gian chuyển đổi thời gian chuyển đổi mô tả cách quá trình hoạt hình được phân phối theo thời gian. Nó sẽ bắt đầu chậm và sau đó đi nhanh hoặc vise Versa. Đó là tài sản phức tạp nhất từ ​​cái nhìn đầu tiên. Nhưng nó trở nên rất đơn giản nếu chúng ta dành một chút thời gian cho nó. Thuộc tính đó chấp nhận hai loại giá trị: một đường cong hoặc các bước. Hãy để bắt đầu từ đường cong, vì nó sử dụng thường xuyên hơn.

Đường cong Bezier Chức năng thời gian có thể được đặt thành đường cong Bezier với 4 điểm điều khiển thỏa mãn các điều kiện: 1. Điểm điều khiển đầu tiên: (0,0). 2. Điểm kiểm soát cuối cùng: (1,1). 3. Đối với các điểm trung gian, giá trị của x phải nằm trong khoảng 0..1, y có thể là bất cứ điều gì. Cú pháp cho một đường cong bezier trong CSS: hình khối (x2, y2, x3, y3). Ở đây chúng ta cần chỉ định các điểm kiểm soát thứ 2 và thứ 3, vì điểm thứ nhất được cố định (0,0) và điểm thứ 4 là (1,1). Hàm thời gian mô tả quá trình hoạt hình đi nhanh như thế nào. ●

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối (0, 0, 1, 1). Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian (x) trôi qua, sự hoàn thành (y) của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn (nhấp vào nó): https://plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier (0, 0, 1, 1); / * Bộ JavaScript còn lại thành 450px */}

Và làm thế nào chúng ta có thể cho thấy một chuyến tàu chậm lại? Chúng ta có thể sử dụng một đường cong bezier khác: hình khối (0,0, 0,5, 0,5, 1,0). Đồ thị:

Như chúng ta có thể thấy, quá trình bắt đầu nhanh: đường cong tăng cao lên cao, sau đó chậm hơn và chậm hơn. Tại đây, chức năng thời gian trong hành động (nhấp vào tàu): https://plnkr.co/edit/ebbtktni1l5096shlcq8?p=preview

CSS:

CSS:

CSS:

CSS:

.Train {trái: 0; Chuyển tiếp: còn lại 5S khối-bezier (0, .5, .5, 1); / * Bộ JavaScript còn lại thành 450px */}

Có một số đường cong tích hợp: tuyến tính, dễ dàng, dễ dàng, dễ dàng và dễ dàng. Tuyến tính là một tốc ký cho hình khối (0, 0, 1, 1)-một đường thẳng, chúng ta đã thấy nó rồi. Các tên khác là những kẻ viết tắt cho hình khối sau đây: dễ dàng *

dễ dàng trong

dễ dàng

dễ dàng-ra ngoài

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối (0, 0, 1, 1). Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian (x) trôi qua, sự hoàn thành (y) của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn (nhấp vào nó): https://plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier (0, 0, 1, 1); / * Bộ JavaScript còn lại thành 450px */}

Và làm thế nào chúng ta có thể cho thấy một chuyến tàu chậm lại? Chúng ta có thể sử dụng một đường cong bezier khác: hình khối (0,0, 0,5, 0,5, 1,0). Đồ thị:

Bước các bước thời gian (số bước [, bắt đầu/kết thúc]) cho phép chia hoạt hình thành các bước. Hãy cùng xem điều đó trong một ví dụ với các chữ số. Dưới đây, một danh sách các chữ số, không có bất kỳ hình ảnh động nào, giống như một nguồn

Chúng tôi sẽ làm cho các chữ số xuất hiện theo cách riêng biệt bằng cách đưa một phần của danh sách bên ngoài cửa sổ màu đỏ vô hình và chuyển danh sách sang trái với mỗi bước. Sẽ có 9 bước, một bước di chuyển cho mỗi chữ số:

#stripe.Animate {biến đổi: dịch (-90%); Chuyển đổi: Biến đổi các bước 9s (9, bắt đầu); }

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Chúng tôi sẽ làm cho các chữ số xuất hiện theo cách riêng biệt bằng cách đưa một phần của danh sách bên ngoài cửa sổ màu đỏ vô hình và chuyển danh sách sang trái với mỗi bước. Sẽ có 9 bước, một bước di chuyển cho mỗi chữ số:

#stripe.Animate {biến đổi: dịch (-90%); Chuyển đổi: Biến đổi các bước 9s (9, bắt đầu); }

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% (thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức)

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% (thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức)

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% (thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức)

1S --20%

8s 8s --80% (giây cuối cùng cho thấy giá trị cuối cùng).

Kết thúc giá trị thay thế có nghĩa là sự thay đổi nên được áp dụng không phải ở đầu, mà ở cuối mỗi giây. Vì vậy, quá trình sẽ diễn ra như thế này: ●

0S - 0

1S --10% (thay đổi đầu tiên ở cuối giây thứ nhất)

2s --20%

… 9s --90%

Ở đây, bước (9, kết thúc) trong hành động (lưu ý tạm dừng giữa thay đổi chữ số đầu tiên): https://plnkr.co/edit/i3soddmnbydkxh2hefak?p=preview

Ngoài ra còn có giá trị tốc ký: ●

bước bắt đầu-giống như các bước (1, bắt đầu). Đó là, hình ảnh động bắt đầu ngay lập tức và mất 1 bước. Vì vậy, nó bắt đầu và kết thúc ngay lập tức, như thể không có hoạt hình. Bước kết thúc-giống như các bước (1, kết thúc): Tạo hình ảnh động trong một bước duy nhất ở cuối thời gian chuyển tiếp.

Những giá trị này hiếm khi được sử dụng, bởi vì đó không thực sự là hoạt hình, mà là một thay đổi một bước.

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% (thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức)

Trong hành động: https://plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước (9, bắt đầu) là số bước. Biến đổi sẽ được chia thành 9 phần (mỗi phần 10%). Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 (bước đầu tiên) ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% (thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức)

Nhiệm vụ Animate A PBER (CSS)

Tầm quan trọng: 5 Hiển thị hình ảnh động như trên hình bên dưới (nhấp vào mặt phẳng):

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px (lớn hơn 10 lần).

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px (lớn hơn 10 lần).

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px (lớn hơn 10 lần).

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px (lớn hơn 10 lần).

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay (CSS): 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng (CSS) để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px (nhảy ra), sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó (nhấp vào máy bay):

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px (lớn hơn 10 lần).

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay (CSS): 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng (CSS) để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px (nhảy ra), sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó (nhấp vào máy bay):

Lấy giải pháp của nhiệm vụ trước đó làm nguồn. Để giải pháp

Tầm quan trọng của vòng tròn hoạt hình: 5 Tạo một chức năng showcircle (CX, CY, RADIUS) cho thấy một vòng tròn phát triển hoạt hình. ●

CX, CY là tọa độ tương đối cửa sổ của trung tâm của vòng tròn,

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay (CSS): 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng (CSS) để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px (nhảy ra), sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó (nhấp vào máy bay):

Lấy giải pháp của nhiệm vụ trước đó làm nguồn. Để giải pháp

Tầm quan trọng của vòng tròn hoạt hình: 5 Tạo một chức năng showcircle (CX, CY, RADIUS) cho thấy một vòng tròn phát triển hoạt hình. ●

CX, CY là tọa độ tương đối cửa sổ của trung tâm của vòng tròn,

Bán kính là bán kính của vòng tròn.

Hoạt hình có cấu trúc Bây giờ chúng ta có thể tạo một chức năng hoạt hình phổ quát hơn dựa trên requestAnimationFrame:

hàm animate ({thời gian, vẽ, thời lượng}) {let start = performance.now (); requestAnimationFrame (chức năng animate (thời gian) {// thời gian chuyển từ 0 đến 1 hãy để thời gian = (thời gian - bắt đầu) / thời lượng; nếu (thời gian> 1) thời gian ) vẽ (tiến trình); // vẽ nó nếu (thời gian <1) {requestAnimationFrame (animate);}}); }

Chức năng Animate chấp nhận 3 tham số mô tả về cơ bản mô tả hoạt hình: Thời lượng Tổng thời gian hoạt hình. Như, 1000. Thời gian (thời gian) hàm thời gian, như chức năng chuyển đổi chuyển đổi CSS-Property có phần thời gian trôi qua (0 khi bắt đầu, 1 ở cuối) và trả về hoàn thành hoạt hình (như y trên đường cong Bezier). Chẳng hạn, một hàm tuyến tính có nghĩa là hình ảnh động đi trên đồng đều với cùng tốc độ:

hàm tuyến tính (thời gian) {return TimeFraction; }

Nó đồ thị của nó: mà giống như chức năng chuyển tiếp: tuyến tính. Có nhiều biến thể thú vị hơn được hiển thị dưới đây. Vẽ (tiến trình) Hàm lấy trạng thái hoàn thành hoạt hình và vẽ nó. Giá trị tiến trình = 0 biểu thị trạng thái hoạt hình bắt đầu và tiến trình = 1 - trạng thái cuối. Đây là chức năng thực sự rút ra hình ảnh động. Nó có thể di chuyển phần tử:

Chức năng Draw (tiến trình) {Train.Style.left = Progress + 'Px'; }

Bằng mọi cách hoặc làm bất cứ điều gì khác, chúng ta có thể làm động bất cứ điều gì, bằng mọi cách. Hãy để kích hoạt độ rộng phần tử từ 0 đến 100% bằng cách sử dụng chức năng của chúng tôi. Nhấp vào phần tử cho bản demo: https://plnkr.co/edit/5l241dcqmzpnofvr2wfk?p=preview Mã cho nó:

animate ({thời lượng: 1000, thời gian (thời gian) {trả lại thời gian

Không giống như hoạt hình CSS, chúng ta có thể tạo bất kỳ chức năng thời gian nào và bất kỳ chức năng vẽ nào ở đây. Hàm thời gian không bị giới hạn bởi các đường cong bezier. Và vẽ có thể vượt xa các thuộc tính, tạo các yếu tố mới cho hoạt hình như pháo hoa hoặc một cái gì đó.

Các chức năng thời gian Chúng tôi thấy hàm thời gian tuyến tính đơn giản nhất ở trên. Hãy cùng xem nhiều hơn trong số họ. Chúng tôi sẽ thử hoạt hình chuyển động với các chức năng thời gian khác nhau để xem cách chúng hoạt động.

Sức mạnh của N Nếu chúng ta muốn tăng tốc hoạt hình, chúng ta có thể sử dụng tiến trình trong Power N. Ví dụ, một đường cong parabol:

hàm tứ giác (thời gian) {return math.pow (thời gian, 2)}

Đồ thị:

Xem trong hành động (bấm để kích hoạt):

Các đường cong hoặc sự kiện hình khối lớn hơn n. Tăng sức mạnh làm cho nó tăng tốc nhanh hơn. Ở đây, biểu đồ cho sự tiến bộ trong Power 5:

Trong hành động:

Hàm hồ quang:

hàm Circ (thời gian) {return 1 - math.sin (math.acos (thời gian)); }

Đồ thị:

Xem trong hành động (bấm để kích hoạt):

Các đường cong hoặc sự kiện hình khối lớn hơn n. Tăng sức mạnh làm cho nó tăng tốc nhanh hơn. Ở đây, biểu đồ cho sự tiến bộ trong Power 5:

Trong hành động:

Hàm hồ quang:

hàm Circ (thời gian) {return 1 - math.sin (math.acos (thời gian)); }

Quay lại: Bow Shoot Chức năng này làm cho Bow Bow bắn súng. Đầu tiên, chúng tôi đã kéo dây cung, và sau đó là bắn súng. Không giống như các chức năng trước đó, nó phụ thuộc vào tham số bổ sung X, hệ số đàn hồi của Cameron. Khoảng cách của dây kéo kéo dài được xác định bởi nó. Mật mã:

Hàm trở lại (x, thời gian) {return math.pow (thời gian

Trong hành động:

Hàm hồ quang:

hàm Circ (thời gian) {return 1 - math.sin (math.acos (thời gian)); }

Quay lại: Bow Shoot Chức năng này làm cho Bow Bow bắn súng. Đầu tiên, chúng tôi đã kéo dây cung, và sau đó là bắn súng. Không giống như các chức năng trước đó, nó phụ thuộc vào tham số bổ sung X, hệ số đàn hồi của Cameron. Khoảng cách của dây kéo kéo dài được xác định bởi nó. Mật mã:

Hàm trở lại (x, thời gian) {return math.pow (thời gian

}

Biểu đồ cho x = 1.5:

Đối với hoạt hình, chúng tôi sử dụng nó với một giá trị cụ thể của x. Ví dụ cho x = 1.5:

Chẳng hạn, chúng ta có thể lấy chức năng nảy được mô tả ở trên và áp dụng nó: hãy để bounceout = makeaseOut (bounce);

Sau đó, độ nảy sẽ không ở đầu, nhưng vào cuối hình ảnh động. Trông thậm chí còn tốt hơn: https://plnkr.co/edit/opusrjafyq8y41qxoold?p=preview

Ở đây chúng ta có thể thấy cách biến đổi thay đổi hành vi của hàm:

Nếu có một hiệu ứng hoạt hình ngay từ đầu, như nảy - nó sẽ được hiển thị ở cuối. Trong biểu đồ phía trên độ nảy thông thường có màu đỏ và độ nảy dễ dàng màu xanh lam. ●

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

EasyInout Chúng tôi cũng có thể hiển thị hiệu ứng cả ở đầu và kết thúc hoạt hình. Biến đổi được gọi là dễ dàng. Với chức năng thời gian, chúng tôi tính toán trạng thái hoạt hình như thế này:

if (thời gian 1) thời gian = 1; // Tính trạng thái hoạt hình hiện tại Let tiến trình = thời gian (thời gian); vẽ (tiến trình); // vẽ nó nếu (thời gian <1) {requestAnimationFrame (animate); }}); }

Tùy chọn: ●

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

EasyInout Chúng tôi cũng có thể hiển thị hiệu ứng cả ở đầu và kết thúc hoạt hình. Biến đổi được gọi là dễ dàng. Với chức năng thời gian, chúng tôi tính toán trạng thái hoạt hình như thế này:

if (thời gian 1) thời gian = 1; // Tính trạng thái hoạt hình hiện tại Let tiến trình = thời gian (thời gian); vẽ (tiến trình); // vẽ nó nếu (thời gian <1) {requestAnimationFrame (animate); }}); }

Tùy chọn: ●

Thời lượng - Tổng thời gian hoạt hình trong MS. Thời gian - Chức năng để tính tiến trình hoạt hình. Nhận một phần thời gian từ 0 đến 1, trả về tiến trình hoạt hình, thường là từ 0 đến 1. Vẽ - hàm để vẽ hình ảnh động.

Ở đây chúng ta có thể thấy cách biến đổi thay đổi hành vi của hàm:

Nếu có một hiệu ứng hoạt hình ngay từ đầu, như nảy - nó sẽ được hiển thị ở cuối. Trong biểu đồ phía trên độ nảy thông thường có màu đỏ và độ nảy dễ dàng màu xanh lam. ●

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

EasyInout Chúng tôi cũng có thể hiển thị hiệu ứng cả ở đầu và kết thúc hoạt hình. Biến đổi được gọi là dễ dàng. Với chức năng thời gian, chúng tôi tính toán trạng thái hoạt hình như thế này:

if (thời gian 1) thời gian = 1; // Tính trạng thái hoạt hình hiện tại Let tiến trình = thời gian (thời gian); vẽ (tiến trình); // vẽ nó nếu (thời gian <1) {requestAnimationFrame (animate); }}); }

Tùy chọn: ●

Thời lượng - Tổng thời gian hoạt hình trong MS. Thời gian - Chức năng để tính tiến trình hoạt hình. Nhận một phần thời gian từ 0 đến 1, trả về tiến trình hoạt hình, thường là từ 0 đến 1. Vẽ - hàm để vẽ hình ảnh động.

Chắc chắn chúng ta có thể cải thiện nó, thêm nhiều chuông và còi, nhưng hình ảnh động JavaScript không được áp dụng hàng ngày. Chúng được sử dụng để làm một cái gì đó thú vị và không đạt tiêu chuẩn. Vì vậy, bạn muốn thêm các tính năng mà bạn cần khi bạn cần. Hoạt hình JavaScript có thể sử dụng bất kỳ chức năng thời gian nào. Chúng tôi đã trình bày rất nhiều ví dụ và biến đổi để làm cho chúng thậm chí còn linh hoạt hơn. Không giống như CSS, chúng tôi không giới hạn ở các đường cong Bezier ở đây.

Điều tương tự là về Draw: chúng ta có thể làm động bất cứ điều gì, không chỉ các thuộc tính CSS.

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

Bounce thông thường - đối tượng nảy ở phía dưới, sau đó ở cuối nhảy mạnh lên đỉnh. Sau khi dễ dàng - nó lần đầu tiên nhảy lên đỉnh, sau đó nảy ở đó.

EasyInout Chúng tôi cũng có thể hiển thị hiệu ứng cả ở đầu và kết thúc hoạt hình. Biến đổi được gọi là dễ dàng. Với chức năng thời gian, chúng tôi tính toán trạng thái hoạt hình như thế này:

if (thời gian 1) thời gian = 1; // Tính trạng thái hoạt hình hiện tại Let tiến trình = thời gian (thời gian); vẽ (tiến trình); // vẽ nó nếu (thời gian <1) {requestAnimationFrame (animate); }}); }

Tùy chọn: ●

Thời lượng - Tổng thời gian hoạt hình trong MS. Thời gian - Chức năng để tính tiến trình hoạt hình. Nhận một phần thời gian từ 0 đến 1, trả về tiến trình hoạt hình, thường là từ 0 đến 1. Vẽ - hàm để vẽ hình ảnh động.

Lớp JavaScript của riêng nó. Cấu trúc DOM, được quản lý chỉ bởi lớp của nó, mã bên ngoài không truy cập vào nó (nguyên tắc đóng gói trên mạng). Kiểu CSS, áp dụng cho thành phần.

API: Sự kiện, phương pháp lớp, vv, để tương tác với các thành phần khác.

Một lần nữa, toàn bộ thành phần của người Viking không có gì đặc biệt. Tồn tại nhiều khung và phương pháp phát triển để xây dựng chúng, mỗi cái với tiếng chuông và còi riêng. Thông thường, các lớp và quy ước CSS đặc biệt được sử dụng để cung cấp cảm giác thành phần của thành phần - phạm vi CSS và đóng gói DOM. Các thành phần web của Web, cung cấp các khả năng trình duyệt tích hợp cho điều đó, vì vậy chúng tôi không thể mô phỏng chúng nữa. ●

Các yếu tố tùy chỉnh bóng tối người khác. Thành phần phạm vi CSS.

- Để xác định các yếu tố HTML tùy chỉnh.

- Để tạo một DOM nội bộ cho thành phần, ẩn khỏi

- để khai báo các kiểu chỉ áp dụng bên trong bóng tối của

Sự kiện nhắm mục tiêu lại sự phát triển.

- để khai báo các kiểu chỉ áp dụng bên trong bóng tối của

Sự kiện nhắm mục tiêu lại sự phát triển.

và những thứ nhỏ khác để làm cho các thành phần tùy chỉnh phù hợp hơn

Trong chương tiếp theo, chúng tôi sẽ đi vào chi tiết về các yếu tố tùy chỉnh của Cameron-tính năng cơ bản và được hỗ trợ tốt của các thành phần web, tốt.

Các yếu tố tùy chỉnh Chúng tôi có thể tạo các yếu tố HTML tùy chỉnh, được mô tả bởi lớp của chúng tôi, với các phương thức và thuộc tính riêng, sự kiện, v.v. Khi một phần tử tùy chỉnh được xác định, chúng ta có thể sử dụng nó ngang bằng với các phần tử HTML tích hợp. Điều đó tuyệt vời, vì từ điển HTML rất phong phú, nhưng không vô hạn. Không có,, chỉ cần nghĩ về bất kỳ thẻ nào khác mà chúng ta có thể cần. Chúng ta có thể xác định chúng với một lớp đặc biệt, và sau đó sử dụng như thể chúng luôn là một phần của HTML. Có hai loại yếu tố tùy chỉnh: 1. Các yếu tố tùy chỉnh tự trị-Các yếu tố hoàn toàn mới, mở rộng lớp HTMLelement trừu tượng. 2. Các yếu tố tích hợp tùy chỉnh-mở rộng các yếu tố tích hợp, như htmlbuttonelement tùy chỉnh, v.v ... Đầu tiên chúng tôi sẽ tạo ra các yếu tố tự trị, và sau đó tùy chỉnh tích hợp. Để tạo một phần tử tùy chỉnh, chúng ta cần nói với trình duyệt một số chi tiết về nó: Cách hiển thị nó, phải làm gì khi phần tử được thêm hoặc xóa vào trang, v.v.

Điều đó được thực hiện bằng cách tạo ra một lớp với các phương pháp đặc biệt. Điều đó dễ dàng, vì chỉ có một vài phương pháp, và tất cả chúng đều là tùy chọn. Ở đây, một bản phác thảo với danh sách đầy đủ:

lớp myelement mở rộng htmlelement {constructor () {super (); // phần tử được tạo} ConnectedCallback () {// Trình duyệt gọi nó khi phần tử được thêm vào tài liệu // (có thể được gọi nhiều lần nếu một phần tử được thêm/xóa) Phần tử được xóa khỏi tài liệu // (có thể được gọi là nhiều lần nếu một phần tử được thêm/xóa lặp đi lặp lại) } AttributechangedCallback (Tên, OldValue, NewValue) {// Được gọi khi một trong các thuộc tính được liệt kê ở trên được sửa đổi )} // Có thể có các phương thức và thuộc tính phần tử khác}

Sau đó, chúng ta cần đăng ký phần tử:

// cho trình duyệt biết rằng được phục vụ bởi lớp mới của chúng tôi.

Bây giờ đối với bất kỳ phần tử HTML nào có thẻ, một thể hiện myelement được tạo và các phương thức nói trên được gọi. Chúng tôi cũng có thể ghi lại.

Tên phần tử tùy chỉnh phải chứa dấu gạch nối -

Tên phần tử tùy chỉnh phải có dấu gạch nối -, ví dụ: My-Element và SuperButton là tên hợp lệ, nhưng myelement thì không. Điều đó để đảm bảo rằng không có xung đột tên giữa các yếu tố HTML tích hợp và tùy chỉnh.

Ví dụ: Ví dụ, có định dạng thời gian, đã tồn tại phần tử trong HTML, cho ngày/giờ. Nhưng nó không tự làm bất kỳ định dạng nào. Hãy để tạo ra phần tử hiển thị thời gian ở định dạng nhận thức ngôn ngữ tốt đẹp:

01.01.2001

John Smith

Ngày sinh nhật: nodes are still at the same place, under `` alert( document.querySelector('user-card span').length ); // 2

Tuy nhiên, các thành viên của người Viking đã được tạo ra cho mục đích kết xuất và xử lý sự kiện. Đó là cách mà mọi thứ được hiển thị. Các nút thực sự không được di chuyển xung quanh! Điều đó có thể dễ dàng được kiểm tra nếu chúng tôi chạy truy vấn: Các nút vẫn ở vị trí của họ.

// Các nút DOM ánh sáng vẫn ở cùng một nơi, trong `` ALERT (document.QuerySelector ('Span thẻ người dùng'). LEGN); // 2

Nó có thể trông thật kỳ quái, nhưng đối với Shadow Dom với các vị trí, chúng ta có thêm một cấp độ DOM DOM, phần cứng của DOM DOM - kết quả của việc chèn khe. Trình duyệt hiển thị nó và sử dụng cho kế thừa phong cách, tuyên truyền sự kiện. Nhưng JavaScript vẫn nhìn thấy tài liệu này như là, trước khi làm phẳng.

here is ignored (as it’s not a top-level child of ):

John Smith

.. ','.

Ý tưởng đầu tiên có thể là /g; Đặt str = `... ..`; cảnh báo (str.match (reg)); // ''

Để xây dựng

Tìm thẻ HTML Giải pháp là. Đặt reg = // g; Đặt str = ''; cảnh báo (str.match (reg)); // '', '',

Để xây dựng

Tìm thẻ HTML Giải pháp là. Đặt reg = // g; Đặt str = ''; cảnh báo (str.match (reg)); // '', '',

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Để xây dựng

Tìm thẻ HTML Giải pháp là. Đặt reg = // g; Đặt str = ''; cảnh báo (str.match (reg)); // '', '',

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Để xây dựng

Tìm thẻ HTML Giải pháp là. Đặt reg = // g; Đặt str = ''; cảnh báo (str.match (reg)); // '', '',

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Để xây dựng

Tìm thẻ HTML Giải pháp là. Đặt reg = // g; Đặt str = ''; cảnh báo (str.match (reg)); // '', '',

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Có một vấn đề nhỏ ở đây: mẫu được tìm thấy #ABC trong #ABCD. Để ngăn chặn điều đó, chúng ta có thể thêm \ b vào cuối: Đặt reg = /#([a-f0-9] {3}) {1,2} \ b /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF

Tìm số dương Một số nguyên không âm là \ d+. Không 0 có thể là chữ số đầu tiên, nhưng chúng ta nên cho phép nó theo các chữ số tiếp theo. Vì vậy, cung cấp cho chúng ta [1-9] \ d*. Một phần thập phân là: \. \ D+. Bởi vì phần thập phân là tùy chọn, hãy để Lôi đặt nó vào ngoặc đơn với bộ định lượng? . Cuối cùng chúng ta có regexp: [1-9] \ d*(\. \ D+)? : hãy để reg = /way1-9THER\D*(\.\D+)?/g; Đặt str = "1.5 0 -5 12. 123.4."; cảnh báo (str.match (reg));

// 1.5, 0, 12, 123.4

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Bắt các nhóm tìm thấy màu trong định dạng #ABC hoặc #ABCDEF A regEXP để tìm kiếm màu 3 chữ số #ABC: / #[A-F0-9] {3} /i. Chúng ta có thể thêm chính xác 3 chữ số hex tùy chọn. Chúng tôi không cần nhiều hơn hoặc ít hơn. Hoặc là chúng tôi có chúng hoặc chúng tôi don. Cách đơn giản nhất để thêm chúng-là nối vào regexp: /#[a-f0-9] {3} ([a-f0-9] {3})? /I

Chúng ta có thể làm điều đó theo cách thông minh hơn mặc dù: /#([A-F0-9] {3}) {1,2} /i. Ở đây, regexp [a-f0-9] {3} nằm trong ngoặc đơn để áp dụng toàn bộ định lượng {1,2} cho toàn bộ nó. Trong hành động: Đặt reg = /#([a-f0-9] {3}) {1,2} /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF #ABC

Để xây dựng

Có một vấn đề nhỏ ở đây: mẫu được tìm thấy #ABC trong #ABCD. Để ngăn chặn điều đó, chúng ta có thể thêm \ b vào cuối: Đặt reg = /#([a-f0-9] {3}) {1,2} \ b /gi; Đặt str = "màu: #3f3; màu nền: #aa00ef; và: #abcd"; cảnh báo (str.match (reg)); // #3f3 #AA00EF

Tìm số dương Một số nguyên không âm là \ d+. Không 0 có thể là chữ số đầu tiên, nhưng chúng ta nên cho phép nó theo các chữ số tiếp theo. Vì vậy, cung cấp cho chúng ta [1-9] \ d*. Một phần thập phân là: \. \ D+. Bởi vì phần thập phân là tùy chọn, hãy để Lôi đặt nó vào ngoặc đơn với bộ định lượng? . Cuối cùng chúng ta có regexp: [1-9] \ d*(\. \ D+)? : hãy để reg = /way1-9THER\D*(\.\D+)?/g; Đặt str = "1.5 0 -5 12. 123.4."; cảnh báo (str.match (reg));

// 1.5, 0, 12, 123.4

Để xây dựng

Tìm các cặp BBTAG Mở thẻ mở là \ [(B | url | QUOTE) \].

Sau đó, để tìm mọi thứ cho đến khi thẻ đóng - hãy để sử dụng mẫu.*? với Flag S để phù hợp với bất kỳ ký tự nào bao gồm cả dòng mới và sau đó thêm một bản sao lưu vào thẻ đóng. Mẫu đầy đủ: \ [(b | url | quote) \].*? \ [/\ 1 \]. Trong hành động: Đặt reg = /\ [(b |Url Đặt str = `[b] Xin chào! [/b] [QUOTE] [url] http://google.com [/url] [/quote]`; cảnh báo (str.match (reg)); // [b] Xin chào! [/b], [QUOTE] [url] http://google.com [/url

Xin lưu ý rằng chúng tôi phải thoát khỏi một dấu gạch chéo cho thẻ đóng [/\ 1], bởi vì thông thường, dấu gạch chéo đóng mẫu. Để xây dựng

Tìm chuỗi trích dẫn Giải pháp: /"(\\. |

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"(\. "\\\\ \\" ".. '; cảnh báo (str.match (reg)); // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Để xây dựng

Tìm thẻ đầy đủ Khởi động mẫu là rõ ràng :). Trong hành động: hãy để reg = /|\s.*?>)/g; cảnh báo ('' .match (reg)); //,

Thông tin JavaScript có tốt cho việc học không?

JavaScript là ngôn ngữ quan trọng nhất bạn cần học như một nhà phát triển frontend.Đó là ngôn ngữ đầu tiên tuyệt vời cho các nhà phát triển web tìm hiểu vì: các ứng dụng web rất năng động vì JavaScript.It's a great first language for web developers to learn because: Web apps are dynamic because of JavaScript.

JavaScript có miễn phí không?

JavaScript là miễn phí để sử dụng cho tất cả mọi người..

Bạn có thể tải xuống JavaScript ở đâu?

Trình cài đặt JavaScript SyncFusion có thể được tải xuống từ trang web SyncFusion.com.Bạn có thể tải xuống trình cài đặt được cấp phép hoặc thử trình cài đặt thử nghiệm của chúng tôi tùy thuộc vào giấy phép của bạn.Syncfusion.com website. You can either download the licensed installer or try our trial installer depending on your license.

JavaScript có khó học không?

Có thể cho rằng, JavaScript là một trong những ngôn ngữ lập trình dễ học nhất, vì vậy nó phục vụ như một ngôn ngữ đầu tiên tuyệt vời cho bất kỳ ai thương hiệu mới với mã hóa.Ngay cả các dòng phức tạp nhất của mã JavaScript cũng có thể được viết từng cái một, trong các đoạn.Nó cũng có thể được kiểm tra trong trình duyệt web cùng một lúc.one of the easiest programming languages to learn, so it serves as a great first language for anyone brand new to coding. Even the most complex lines of JavaScript code can be written one by one, in fragments. It can also be tested in the web browser at the same time.