Các loại nguyên thủy so với các loại tham chiếu JavaScript

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

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

let foo = 42; // foo is now a number
foo = "bar"; // foo is now a string
foo = true; // foo is now a boolean

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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421

É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ừ null, có thể được kiểm tra bởi toán tử typeof. typeof null trả về "object", vì vậy người ta phải sử dụng === null để kiểm tra null

Tất cả các loại nguyên thủy, ngoại trừ null

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
3 cung cấp các phương thức như
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2 sẽ tạo ra một ngoại lệ
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
7, điều này đòi hỏi phải giới thiệu toán tử chuỗi tùy chọn

Typetypeof return valueObject wrapper"object"N/A
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
0N/A
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
1
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
2
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
3
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
3
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
5
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
6
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
7
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
8
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
9
// BigInt
const x = BigInt[Number.MAX_SAFE_INTEGER]; // 9007199254740991n
x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal

// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992
0

Các trang tham khảo 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ị. null

Loại Không xác định là nơi sinh sống của chính xác một giá trị.

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2

Về mặt khái niệm,

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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à
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2 khi thứ gì đó không có giá trị

  • Câu lệnh
    // BigInt
    const x = BigInt[Number.MAX_SAFE_INTEGER]; // 9007199254740991n
    x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal
    
    // Number
    Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992
    
    7 không có giá trị [_______17_______8] hoàn toàn trả về
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    2
  • Truy cập thuộc tính đối tượng không tồn tại [
    console.log[{} + []]; // "[object Object]"
    
    0] trả về
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    2
  • Một khai báo biến không có khởi tạo [_______24_______2] ngầm định khởi tạo biến thành
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    2
  • Nhiều phương thức, chẳng hạn như
    console.log[{} + []]; // "[object Object]"
    
    4 và
    console.log[{} + []]; // "[object Object]"
    
    5, trả về
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    2 khi không tìm thấy phần tử nào

null ít được sử dụng hơn trong ngôn ngữ chính. Vị trí quan trọng nhất là phần cuối của chuỗi nguyên mẫu — sau đó là các phương thức tương tác với nguyên mẫu, chẳng hạn như

console.log[{} + []]; // "[object Object]"
8,
console.log[{} + []]; // "[object Object]"
9, v.v. , chấp nhận hoặc trả lại null thay vì
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2

null là một , nhưng

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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ì
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2 không nên được xác định lại hoặc làm mờ

Loại

console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
2 đại diện cho một thực thể logic và có hai giá trị. null6 và null7

Cá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, null8, null9, v.v.

Loại

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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 [typeof1] đến 21024 [typeof2] 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 typeof5

Các giá trị nằm ngoài phạm vi ±[2-1074 tới 21024] được tự động chuyển đổi

  • Các giá trị dương lớn hơn typeof2 được chuyển đổi thành typeof7
  • Các giá trị dương nhỏ hơn typeof1 được chuyển đổi thành typeof9
  • Các giá trị âm nhỏ hơn -typeof2 được chuyển đổi thành typeof null1
  • Các giá trị âm lớn hơn -typeof1 được chuyển đổi thành typeof null3

typeof7 và typeof null1 hoạt động tương tự như toán học vô hạn, nhưng với một số khác biệt nhỏ;

Kiểu Number chỉ có một giá trị với nhiều cách biểu diễn. typeof null8 được thể hiện dưới dạng cả typeof null3 và typeof9 [trong đó typeof null8 là bí danh của typeof9]. Trong thực tế, hầu như không có sự khác biệt giữa các cách biểu diễn khác nhau; . Tuy nhiên, bạn có thể nhận thấy điều này khi bạn chia cho 0

console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity

"object"5 ["Không phải là số"] là một loại giá trị số đặc biệt thường gặp khi kết quả của phép toán số học không thể được biểu thị dưới dạng số. Nó cũng là giá trị duy nhất trong JavaScript không bằng chính 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

console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
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 [typeof4] cho Numbers

Một BigInt được tạo bằng cách nối thêm "object"8 vào cuối một số nguyên hoặc bằng cách gọi hàm "object"9

Ví dụ này chứng minh nơi tăng typeof4 trả về kết quả mong đợi

// BigInt
const x = BigInt[Number.MAX_SAFE_INTEGER]; // 9007199254740991n
x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal

// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992

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 === null1, === null2, === null3, === null4 và === null5 — toán tử duy nhất bị cấm là === null6. Một BigInt không hoàn toàn bằng một Số có cùng giá trị toán học, nhưng nó đại khái là như vậy

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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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 nhau

Loại

console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
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 null8, phần tử tiếp theo ở chỉ mục
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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ụ:

  • Một chuỗi con của bản gốc bằng cách sử dụng
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    02
  • Nối hai chuỗi bằng toán tử nối [=== null1] hoặc
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    04

Cẩn thận với việc "gõ chuỗi" mã của bạn

Việ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

  • Thật dễ dàng để xây dựng các chuỗi phức tạp với phép nối
  • Các chuỗi rất dễ gỡ lỗi [những gì bạn thấy được in ra luôn là những gì có trong chuỗi]
  • Chuỗi là mẫu số chung của rất nhiều API [trường đầu vào, giá trị lưu trữ cục bộ, phản hồi
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    05 khi sử dụng
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    06, v.v. ] và có thể chỉ hoạt động với các chuỗi

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

// BigInt
const x = BigInt[Number.MAX_SAFE_INTEGER]; // 9007199254740991n
x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal

// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992
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ác

Trong 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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
08 hoặc đọc chúng qua
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
09. Bạn có thể đọc thêm về các sắc thái khác nhau trên trang
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
08

thuộc tính dữ liệu

Thuộ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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
11

Giá 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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
12

Mộ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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
13

Giá trị boolean cho biết liệu thuộc tính có thể được liệt kê bằng vòng lặp

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
15

Giá 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ập

Liên kết khóa với một trong hai hàm truy cập [

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
16 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
16

Mộ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à

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
17

Mộ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à

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
2

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
13

Giá trị boolean cho biết liệu thuộc tính có thể được liệt kê bằng vòng lặp

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
15

Giá 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 null — về mặt khái niệm, đó là một thuộc tính ẩn của đối tượng, thường được biểu diễn dưới dạng

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
26. Các thuộc tính của
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
30 tích hợp sẵn trong JavaScript

Mả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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
31

Ngoài ra, mảng kế thừa từ

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
32, cung cấp một số phương thức thuận tiện để thao tác với mảng. Ví dụ,
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
33 tìm kiếm một giá trị trong mảng và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
35,
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
37 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
38

Các cấu trúc dữ liệu này lấy tham chiếu đối tượng làm khóa.

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
39 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
40 đại diện cho tập hợp các giá trị duy nhất, trong khi
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
28 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
28 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
39. Tuy nhiên, vì các đối tượng không thể so sánh được [ví dụ: theo nghĩa
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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ả
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
42s] có thể có hiệu suất tra cứu xấp xỉ logarit theo thời gian không đổi

Thô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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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.
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
28s và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
42s giúp dễ dàng liên kết dữ liệu riêng tư với một đối tượng

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
42 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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 cho

JSON [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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
52 để biết thêm chi tiết

JavaScript 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ụ

  • Hàm tạo
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    53, khi nó nhận được một đối số không phải là đối tượng
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    30 — chuỗi đại diện cho chuỗi ngày, trong khi số đại diện cho dấu thời gian
  • Toán tử === null1 — nếu một toán hạng là một chuỗi, phép nối chuỗi được thực hiện;
  • Toán tử
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    56 — nếu một toán hạng là nguyên thủy trong khi toán hạng kia là đối tượng, thì đối tượng được chuyển đổi thành giá trị nguyên thủy không có loại ưu tiên

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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
59 trước
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
60, tương tự như hành vi của nhưng khác với

Phương thức

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
7. Đối với
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
59 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

console.log[{} + []]; // "[object Object]"

Cả

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
68 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
69 đều không có phương thức
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
57. Cả
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
68 và
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
69 đều kế thừa
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
59 từ
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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 đó,
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
60 được gọi thay thế.
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
76 trả về
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
77, trong khi
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
78 trả về
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
79, vì vậy kết quả là phép nối của chúng.
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
77

Phương thức

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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ì
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
59 được ưu tiên gọi; . Các đối tượng
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
30 và
// BigInt
const x = BigInt[Number.MAX_SAFE_INTEGER]; // 9007199254740991n
x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal

// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992
0 là các đối tượng tích hợp duy nhất ghi đè phương thức
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
57.
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
87 coi gợi ý của
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
58 như thể nó là
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
7, trong khi
const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
90 bỏ qua gợi ý và luôn trả về một ký hiệu

Có 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ư

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
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

  • const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    93 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    59 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    60
  • , ,.
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    96 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    59 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    60
  • const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    99 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    60 →
    const foo = 42; // foo is a number
    const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
    console.log[result]; // 421
    
    59

Trong mọi trường hợp,

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log[result]; // 421
57, nếu có, phải có thể gọi được và trả về một giá trị nguyên thủy, trong khi
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
03 hoặc
console.log[42 / +0]; // Infinity
console.log[42 / -0]; // -Infinity
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. Nguyên thủy kết quả sau đó chịu sự ép buộc hơn nữa tùy thuộc vào ngữ cảnh

Sự khác biệt giữa kiểu nguyên thủy và kiểu tham chiếu là gì?

Biến trong Java được phân loại thành biến nguyên thủy và biến tham chiếu. Theo quan điểm của lập trình viên, thông tin của biến nguyên thủy được lưu dưới dạng giá trị của biến đó, trong khi biến tham chiếu chứa tham chiếu đến thông tin liên quan đến biến đó .

Các loại tham chiếu trong JavaScript là gì?

Giá trị tham chiếu. JavaScript cung cấp ba loại giá trị Tham chiếu bao gồm Mảng, Đối tượng và Hàm .

Chuỗi là kiểu nguyên thủy hay kiểu tham chiếu?

Chắc chắn rồi, Chuỗi không phải là kiểu dữ liệu nguyên thủy . Nó là kiểu dữ liệu dẫn xuất. Các kiểu dữ liệu dẫn xuất còn được gọi là các kiểu tham chiếu vì chúng tham chiếu đến một đối tượng.

Sự khác biệt giữa các kiểu dữ liệu nguyên thủy và không nguyên thủy trong JavaScript là gì?

Sự khác biệt cơ bản giữa nguyên thủy và không nguyên thủy là nguyên thủy là bất biến và không nguyên thủy là có thể thay đổi . Giá trị có thể thay đổi là những giá trị có thể được sửa đổi sau khi tạo. Giá trị bất biến là những giá trị không thể sửa đổi sau khi tạo.

Chủ Đề