JavaScript sẽ thực hiện các loại?
Tất cả các ngôn ngữ lập trình đều có cấu trúc dữ liệu tích hợp, nhưng chúng thường khác nhau giữa ngôn ngữ này với ngôn ngữ khác. Bài viết này cố gắng liệt kê các cấu trúc dữ liệu tích hợp có sẵn trong JavaScript và những thuộc tính mà chúng có. Chúng có thể được sử dụng để xây dựng các cấu trúc dữ liệu khác Show Tổng quan về ngôn ngữ cung cấp một bản tóm tắt tương tự về các loại dữ liệu phổ biến, nhưng có nhiều so sánh hơn với các ngôn ngữ khác JavaScript là một ngôn ngữ động với. Các biến trong JavaScript không được liên kết trực tiếp với bất kỳ loại giá trị cụ thể nào và bất kỳ biến nào cũng có thể được gán (và gán lại) giá trị của tất cả các loại
JavaScript cũng là một ngôn ngữ được gõ yếu, có nghĩa là nó cho phép chuyển đổi kiểu ẩn khi một thao tác liên quan đến các kiểu không khớp, thay vì đưa ra các lỗi kiểu
Ép buộc ngầm rất thuận tiện, nhưng có thể là một khẩu súng ngắn tiềm năng nếu nhà phát triển không có ý định thực hiện chuyển đổi hoặc có ý định chuyển đổi theo hướng khác (ví dụ: chuỗi thành số thay vì số thành chuỗi). Đối với và , JavaScript đã cố tình không cho phép một số chuyển đổi loại ngầm định Tất cả các loại ngoại trừ xác định các giá trị bất biến được biểu thị trực tiếp ở mức thấp nhất của ngôn ngữ. Chúng tôi coi các giá trị của các loại này là giá trị nguyên thủy Tất cả các kiểu nguyên thủy, ngoại trừ Tất cả các loại nguyên thủy, ngoại trừ 2, đều có các loại trình bao bọc đối tượng tương ứng, cung cấp các phương thức hữu ích để làm việc với các giá trị nguyên thủy. Ví dụ, đối tượng 3 cung cấp các phương thức như 4. Khi một thuộc tính được truy cập trên một giá trị nguyên thủy, JavaScript sẽ tự động bọc giá trị đó vào đối tượng trình bao bọc tương ứng và thay vào đó truy cập thuộc tính trên đối tượng. Tuy nhiên, việc truy cập một thuộc tính trên null hoặc 2 sẽ tạo ra một ngoại lệ 7, điều này đòi hỏi phải giới thiệu toán tử chuỗi tùy chọnTypetypeof return valueObject wrapper"object" N/A 0N/A 1 2 3 3 5 6 7 8 9 0Các trang tham chiếu của các lớp trình bao bọc đối tượng chứa nhiều thông tin hơn về các phương thức và thuộc tính có sẵn cho từng loại, cũng như các mô tả chi tiết về ngữ nghĩa của chính các loại nguyên thủy. Loại Null có chính xác một giá trị. Loại Không xác định là nơi sinh sống của chính xác một giá trị. 2Về mặt khái niệm, 2 biểu thị sự vắng mặt của một giá trị, trong khi null biểu thị sự vắng mặt của một đối tượng (cũng có thể là lý do cho). Ngôn ngữ thường mặc định là 2 khi thứ gì đó không có giá trị
8, 9, v.v. , chấp nhận hoặc trả lại null thay vì 2
2 là một điều bình thường xảy ra để trở thành một tài sản toàn cầu. Trong thực tế, sự khác biệt là nhỏ, vì 2 không nên được xác định lại hoặc làm mờLoại 2 đại diện cho một thực thể logic và có hai giá trị. null 6 và null 7Các giá trị Boolean thường được sử dụng cho các hoạt động có điều kiện, bao gồm các toán tử bậc ba, Loại 3 là một. Nó có khả năng lưu trữ các số dấu phẩy động dương trong khoảng từ 2-1074 (typeof 1) đến 21024 (typeof 2) cũng như các số dấu phẩy động âm trong khoảng từ -2-1074 đến -21024, nhưng nó chỉ có thể lưu trữ an toàn các số nguyên trong phạm vi - . Ngoài phạm vi này, JavaScript không còn có thể biểu diễn số nguyên một cách an toàn nữa; . Bạn có thể kiểm tra xem một số có nằm trong phạm vi số nguyên an toàn hay không bằng cách sử dụng typeof 5Các giá trị nằm ngoài phạm vi ±(2-1074 tới 21024) được tự động chuyển đổi
Kiểu Number chỉ có một giá trị với nhiều cách biểu diễn.
Mặc dù một số về mặt khái niệm là một "giá trị toán học" và luôn được mã hóa bằng dấu phẩy động hoàn toàn, nhưng JavaScript cung cấp. Khi áp dụng các toán tử theo bit, số đầu tiên được chuyển đổi thành số nguyên 32 bit Ghi chú. Mặc dù các toán tử bitwise có thể được sử dụng để biểu diễn một số giá trị Boolean trong một số duy nhất bằng cách sử dụng mặt nạ bit, nhưng điều này thường được coi là một cách làm không tốt. JavaScript cung cấp các phương tiện khác để biểu diễn một tập hợp các Boolean (chẳng hạn như một mảng Boolean hoặc một đối tượng có giá trị Boolean được gán cho các thuộc tính được đặt tên). Mặt nạ bit cũng có xu hướng làm cho mã khó đọc, khó hiểu và khó bảo trì hơn Có thể cần phải sử dụng các kỹ thuật như vậy trong các môi trường rất hạn chế, chẳng hạn như khi cố gắng đối phó với các hạn chế của bộ nhớ cục bộ hoặc trong các trường hợp cực đoan (chẳng hạn như khi mỗi bit trên mạng được tính). Kỹ thuật này chỉ nên được xem xét khi nó là biện pháp cuối cùng có thể được thực hiện để tối ưu hóa kích thước Loại 6 là một số nguyên thủy trong JavaScript có thể biểu thị các số nguyên với độ lớn tùy ý. Với BigInts, bạn có thể lưu trữ và vận hành một cách an toàn trên các số nguyên lớn thậm chí vượt quá giới hạn số nguyên an toàn (typeof 4) cho NumbersMột BigInt được tạo bằng cách nối thêm Ví dụ này chứng minh nơi tăng
Bạn có thể sử dụng hầu hết các toán tử để làm việc với BigInt, bao gồm Các giá trị BigInt không phải lúc nào cũng chính xác hơn và cũng không phải lúc nào cũng kém chính xác hơn các số, vì BigInt không thể biểu thị các số phân số, nhưng có thể biểu thị các số nguyên lớn chính xác hơn. Không loại nào kéo theo loại kia và chúng không thể thay thế lẫn nhau. Một 7 được ném ra nếu các giá trị BigInt được trộn lẫn với các số thông thường trong các biểu thức số học hoặc nếu chúng là của nhauLoại 8 đại diện cho dữ liệu văn bản và được mã hóa thành một chuỗi các giá trị số nguyên không dấu 16 bit đại diện cho. Mỗi phần tử trong xâu chiếm một vị trí trong xâu. Phần tử đầu tiên ở chỉ mục typeof null 8, phần tử tiếp theo ở chỉ mục 00, v.v. Độ dài của một chuỗi là số lượng đơn vị mã UTF-16 trong đó, có thể không tương ứng với số lượng ký tự Unicode thực tế; Chuỗi JavaScript là bất biến. Điều này có nghĩa là một khi chuỗi được tạo, không thể sửa đổi nó. Các phương thức chuỗi tạo các chuỗi mới dựa trên nội dung của chuỗi hiện tại - ví dụ:
Cẩn thận với việc "gõ chuỗi" mã của bạnViệc sử dụng các chuỗi để biểu diễn dữ liệu phức tạp có thể rất hấp dẫn. Làm điều này đi kèm với lợi ích ngắn hạn
Với các quy ước, có thể biểu diễn bất kỳ cấu trúc dữ liệu nào trong một chuỗi. Điều này không làm cho nó một ý tưởng tốt. Chẳng hạn, với một dấu phân cách, người ta có thể mô phỏng một danh sách (trong khi một mảng JavaScript sẽ phù hợp hơn). Thật không may, khi dấu phân cách được sử dụng trong một trong các thành phần "danh sách", thì danh sách đó bị hỏng. Một ký tự thoát có thể được chọn, v.v. Tất cả điều này yêu cầu các quy ước và tạo ra gánh nặng bảo trì không cần thiết Sử dụng chuỗi cho dữ liệu văn bản. Khi biểu diễn dữ liệu phức tạp, hãy phân tích chuỗi và sử dụng phép trừu tượng thích hợp Một 0 là một giá trị nguyên thủy duy nhất và bất biến và có thể được sử dụng làm khóa của thuộc tính Đối tượng (xem bên dưới). Trong một số ngôn ngữ lập trình, Biểu tượng được gọi là "nguyên tử". Mục đích của các ký hiệu là tạo các khóa thuộc tính duy nhất được đảm bảo không xung đột với các khóa từ mã khácTrong khoa học máy tính, một đối tượng là một giá trị trong bộ nhớ có thể được tham chiếu bởi một mã định danh. Trong JavaScript, đối tượng là giá trị duy nhất có thể thay đổi. Trên thực tế, các chức năng cũng là các đối tượng có khả năng bổ sung có thể gọi được Trong JavaScript, các đối tượng có thể được xem như một tập hợp các thuộc tính. Với , một bộ thuộc tính giới hạn được khởi tạo; . Thuộc tính đối tượng tương đương với cặp khóa-giá trị. Các khóa thuộc tính là hoặc. Giá trị thuộc tính có thể là giá trị của bất kỳ loại nào, kể cả các đối tượng khác, cho phép xây dựng cấu trúc dữ liệu phức tạp Có hai loại thuộc tính đối tượng. các và. Mỗi thuộc tính có các thuộc tính tương ứng. Mỗi thuộc tính được công cụ JavaScript truy cập nội bộ, nhưng bạn có thể đặt chúng qua 08 hoặc đọc chúng qua 09. Bạn có thể đọc thêm về các sắc thái khác nhau trên trang 08thuộc tính dữ liệuThuộc tính dữ liệu liên kết một khóa với một giá trị. Nó có thể được mô tả bởi các thuộc tính sau 11Giá trị được truy xuất bởi quyền truy cập của thuộc tính. Có thể là bất kỳ giá trị JavaScript nào 12Một giá trị boolean cho biết liệu thuộc tính có thể được thay đổi bằng một phép gán hay không 13Giá trị boolean cho biết liệu thuộc tính có thể được liệt kê bằng vòng lặp 14 hay không. Xem thêm Khả năng liệt kê và quyền sở hữu các thuộc tính để biết cách liệt kê tương tác với các chức năng và cú pháp khác 15Giá trị boolean cho biết liệu thuộc tính có thể bị xóa hay không, có thể thay đổi thành thuộc tính trình truy cập và có thể thay đổi thuộc tính của nó hay không Thuộc tính truy cậpLiên kết khóa với một trong hai hàm truy cập ( 16 và 17) để truy xuất hoặc lưu trữ giá trịGhi chú. Điều quan trọng là phải nhận ra thuộc tính của trình truy cập - không phải phương thức của trình truy cập. Chúng ta có thể cung cấp cho một trình truy cập giống như lớp đối tượng JavaScript bằng cách sử dụng một hàm làm giá trị — nhưng điều đó không biến đối tượng thành một lớp Một thuộc tính truy cập có các thuộc tính sau 16Một hàm được gọi với một danh sách đối số trống để truy xuất giá trị thuộc tính bất cứ khi nào thực hiện truy cập vào giá trị. Xem thêm getters. Có thể là 2 17Một hàm được gọi với một đối số chứa giá trị được gán. Được thực thi bất cứ khi nào một thuộc tính được chỉ định cố gắng thay đổi. Xem thêm setters. Có thể là 2 13Giá trị boolean cho biết liệu thuộc tính có thể được liệt kê bằng vòng lặp 14 hay không. Xem thêm Khả năng liệt kê và quyền sở hữu các thuộc tính để biết cách liệt kê tương tác với các chức năng và cú pháp khác 15Giá trị boolean cho biết liệu thuộc tính có thể bị xóa hay không, có thể thay đổi thành thuộc tính dữ liệu và có thể thay đổi thuộc tính của nó hay không Nguyên mẫu của một đối tượng trỏ tới một đối tượng khác hoặc tới 26. Các thuộc tính của 26 của đối tượng cũng có thể được truy cập trên chính đối tượng đóCác đối tượng là các cặp khóa-giá trị đặc biệt, vì vậy chúng thường được sử dụng làm bản đồ. Tuy nhiên, có thể có các vấn đề về công thái học, bảo mật và hiệu suất. Thay vào đó, hãy sử dụng 28 để lưu trữ dữ liệu tùy ý. Nội dung thảo luận chi tiết hơn về ưu và nhược điểm giữa các đối tượng đơn giản và bản đồ để lưu trữ các liên kết khóa-giá trịKhi biểu thị ngày tháng, lựa chọn tốt nhất là sử dụng tiện ích 30 tích hợp sẵn trong JavaScriptMảng là các đối tượng thông thường có mối quan hệ cụ thể giữa các thuộc tính có khóa số nguyên và thuộc tính 31Ngoài ra, mảng kế thừa từ 32, cung cấp một số phương thức thuận tiện để thao tác với mảng. Ví dụ, 33 tìm kiếm một giá trị trong mảng và 34 thêm một phần tử vào mảng. Điều này làm cho Mảng trở thành một ứng cử viên hoàn hảo để biểu diễn các danh sách có thứ tựMảng đã nhập trình bày dạng xem giống như mảng của bộ đệm dữ liệu nhị phân cơ bản và cung cấp nhiều phương thức có ngữ nghĩa tương tự với các đối tác mảng. "Mảng đã nhập" là một thuật ngữ chung cho một loạt các cấu trúc dữ liệu, bao gồm 35, 36, v.v. Kiểm tra trang mảng đã nhập để biết thêm thông tin. Các mảng đã nhập thường được sử dụng cùng với 37 và 38Các cấu trúc dữ liệu này lấy tham chiếu đối tượng làm khóa. 39 và 40 đại diện cho tập hợp các giá trị duy nhất, trong khi 28 và 42 đại diện cho tập hợp các liên kết khóa-giá trịBạn có thể tự thực hiện 28 và 39. Tuy nhiên, vì các đối tượng không thể so sánh được (ví dụ: theo nghĩa 45 "nhỏ hơn",), công cụ cũng không hiển thị hàm băm của nó cho các đối tượng, nên hiệu suất tra cứu nhất thiết phải là tuyến tính. Việc triển khai riêng của chúng (bao gồm cả 42s) có thể có hiệu suất tra cứu xấp xỉ logarit theo thời gian không đổiThông thường, để liên kết dữ liệu với nút DOM, người ta có thể đặt thuộc tính trực tiếp trên đối tượng hoặc sử dụng thuộc tính 47. Điều này có nhược điểm là dữ liệu có sẵn cho bất kỳ tập lệnh nào chạy trong cùng ngữ cảnh. 28s và 42s giúp dễ dàng liên kết dữ liệu riêng tư với một đối tượng 42 và 40 chỉ cho phép các khóa đối tượng và các khóa được phép thu gom rác ngay cả khi chúng vẫn còn trong bộ sưu tập. Chúng được sử dụng đặc biệt choJSON (Ký hiệu đối tượng JavaScript) là một định dạng trao đổi dữ liệu nhẹ, bắt nguồn từ JavaScript, nhưng được sử dụng bởi nhiều ngôn ngữ lập trình. JSON xây dựng các cấu trúc dữ liệu phổ quát có thể được chuyển giữa các môi trường khác nhau và thậm chí giữa các ngôn ngữ. Xem 52 để biết thêm chi tiếtJavaScript có một thư viện tiêu chuẩn gồm các đối tượng tích hợp sẵn. Đọc tài liệu tham khảo để tìm hiểu thêm về các đối tượng tích hợp Như đã đề cập ở trên, JavaScript là một ngôn ngữ. Điều này có nghĩa là bạn có thể thường xuyên sử dụng giá trị của một loại trong đó loại khác được mong đợi và ngôn ngữ sẽ chuyển đổi giá trị đó thành loại phù hợp với bạn. Để làm như vậy, JavaScript xác định một số quy tắc cưỡng chế Quá trình này được sử dụng khi một giá trị nguyên thủy được mong đợi, nhưng không có sự ưu tiên mạnh mẽ nào cho loại thực tế sẽ là gì. Điều này thường xảy ra khi a , an hoặc a đều được chấp nhận như nhau. Ví dụ
Thao tác này không thực hiện bất kỳ chuyển đổi nào nếu giá trị đã là nguyên thủy. Các đối tượng được chuyển đổi thành nguyên thủy bằng cách gọi các phương thức 57 (với _________58 là gợi ý), ____1_______59 và ______60 của nó, theo thứ tự đó. Lưu ý rằng chuyển đổi nguyên thủy gọi 59 trước 60, tương tự như hành vi của nhưng khác vớiPhương thức 57, nếu có, phải trả về một nguyên hàm — trả về một đối tượng sẽ dẫn đến một 7. Đối với 59 và 60, nếu một đối tượng trả về một đối tượng, thì giá trị trả về sẽ bị bỏ qua và thay vào đó, giá trị trả về của đối tượng kia sẽ được sử dụng; . Ví dụ, trong đoạn mã sau
Cả 68 và 69 đều không có phương thức 57. Cả 68 và 69 đều kế thừa 59 từ 74, trả về chính đối tượng đó. Vì giá trị trả về là một đối tượng nên nó bị bỏ qua. Do đó, 60 được gọi thay thế. 76 trả về 77, trong khi 78 trả về 79, vì vậy kết quả là phép nối của chúng. 77Phương thức 57 luôn được ưu tiên khi thực hiện chuyển đổi sang bất kỳ loại nguyên thủy nào. Chuyển đổi nguyên thủy thường hoạt động giống như chuyển đổi số, bởi vì 59 được ưu tiên gọi; . Các đối tượng 30 và 0 là các đối tượng tích hợp duy nhất ghi đè phương thức 57. 87 coi gợi ý của 58 như thể nó là 7, trong khi 90 bỏ qua gợi ý và luôn trả về một ký hiệuCó hai loại số. và. Đôi khi, ngôn ngữ cụ thể mong đợi một số hoặc một BigInt (chẳng hạn như 91, trong đó chỉ mục phải là một số); . Đối với các quy trình cưỡng chế nghiêm ngặt không cho phép chuyển đổi ngầm định từ loại khác, hãy xem vàSự ép buộc số gần giống như , ngoại trừ việc BigInts được trả về nguyên trạng thay vì gây ra 7. Ép buộc số được sử dụng bởi tất cả các toán tử số học, vì chúng bị quá tải cho cả số và BigInt. Ngoại lệ duy nhất là phép cộng đơn phương, luôn thực hiện ép sốTất cả các loại dữ liệu, ngoại trừ Null, Undefined và Symbol, đều có quy trình cưỡng chế tương ứng. Xem , , và để biết thêm chi tiết Như bạn có thể nhận thấy, có ba đường dẫn riêng biệt qua đó các đối tượng có thể được chuyển đổi thành nguyên thủy
Trong mọi trường hợp, 57, nếu có, phải có thể gọi được và trả về một giá trị nguyên thủy, trong khi 03 hoặc 04 sẽ bị bỏ qua nếu chúng không thể gọi được hoặc trả về một đối tượng. Khi kết thúc quá trình, nếu thành công, kết quả được đảm bảo là nguyên thủy. Kết quả nguyên thủy sau đó có thể bị ép buộc hơn nữa tùy thuộc vào ngữ cảnh
Bạn có thể sử dụng các loại trong JavaScript không?typeof là một từ khóa JavaScript sẽ trả về loại biến khi bạn gọi nó . Bạn có thể sử dụng điều này để xác thực các tham số chức năng hoặc kiểm tra xem các biến đã được xác định chưa. Ngoài ra còn có những công dụng khác. Toán tử typeof rất hữu ích vì nó là một cách dễ dàng để kiểm tra loại biến trong mã của bạn.
Tại sao JavaScript không có loại?Javascript có các kiểu nhưng không kiểm tra kiểu trong các hàm hoặc hầu hết mọi nơi khác. Lý do có lẽ là vì nó được hình thành như một ngôn ngữ kịch bản được cho là đơn giản nhất có thể .
TypeScript có phải là tương lai không?Vì ngôn ngữ lập trình đã nhập này được thiết kế để hoạt động với JS nên nó sẽ không bao giờ thay thế JavaScript. Nó sẽ luôn xây dựng trên JS như một nền tảng vững chắc. TypeScript dự kiến sẽ tiếp tục phát triển phổ biến trong tương lai gần vì nó mang lại nhiều lợi ích cho các nhà phát triển.
Làm cách nào để khai báo một loại trong JavaScript?Bạn có thể khai báo một biến theo hai cách. . Với từ khóa var. Ví dụ: biến x = 42. Cú pháp này có thể được sử dụng để khai báo cả biến cục bộ và biến toàn cục, tùy thuộc vào ngữ cảnh thực thi Với từ khóa const hoặc let. Ví dụ: đặt y = 13. Cú pháp này có thể được sử dụng để khai báo một biến cục bộ trong phạm vi khối |