Làm cách nào để sử dụng giá trị enum trong JavaScript?

Bạn có thể gán các giá trị số duy nhất cho mỗi giá trị enum. Sau đó, các giá trị sẽ không tự động tăng lên

Thí dụ

enum Mã trạng thái {
Không tìm thấy = 404,
Thành công = 200,
Đã chấp nhận = 202,
Yêu cầu xấu = 400
}
// bản ghi 404
bảng điều khiển. nhật ký (Mã trạng thái. Không tìm thấy);
// bản ghi 200
bảng điều khiển. nhật ký (Mã trạng thái. Sự thành công);

Tự mình thử »



Chuỗi Enums

Enums cũng có thể chứa strings. Điều này phổ biến hơn so với enum số, vì tính dễ đọc và mục đích của chúng

Thí dụ

enum CardinalDirections {
Bắc = 'Bắc',
Đông = "Đông",
Nam = "Nam",
Tây = "Tây"
};
// nhật ký "Bắc"
bảng điều khiển. nhật ký (Hướng dẫn hồng y. Phía bắc);
// nhật ký "Tây"
bảng điều khiển. nhật ký (Hướng dẫn hồng y. Hướng Tây);

Tự mình thử »

Về mặt kỹ thuật, bạn có thể trộn và khớp các giá trị chuỗi và số enum, nhưng không nên làm như vậy

Các enum của TypeScript là một tính năng rất tiện lợi có trong nhiều ngôn ngữ khác. Tuy nhiên, JavaScript không có khái niệm tương tự vào thời điểm này. Nhưng những gì JavaScript thiếu trong đường cú pháp, nó bù đắp bằng tính linh hoạt

Cách dễ nhất để xác định một enum là sử dụng Object.freeze() kết hợp với một đối tượng đơn giản. Điều này sẽ đảm bảo rằng đối tượng enum không thể bị thay đổi

const daysEnum = Object.freeze({
  monday: 0,
  tuesday: 1,
  wednesday: 2,
  thursday: 3,
  friday: 4,
  saturday: 5,
  sunday: 6
});

Tiến thêm một bước nữa, người ta có thể trích xuất logic thành một hàm với số lượng đối số thay đổi và tạo ra một đối tượng cố định. Có rất ít lợi ích đối với kỹ thuật này, vì vậy một giải pháp thay thế tốt hơn là tạo một class đơn giản. Xét cho cùng, enums phổ biến hơn trong các ngôn ngữ lập trình hướng đối tượng, vì vậy điều này nghe có vẻ rất phù hợp

Một lớp Enum sẽ chỉ yêu cầu một constructor với số lượng đối số thay đổi. Công việc của nó là thêm từng khóa vào đối tượng enum và đóng băng thể hiện mới được tạo. Một cải tiến tiềm năng sẽ là cung cấp quyền truy cập vào các giá trị enum dưới dạng chuỗi. Rõ ràng, điều này có thể được thực hiện bằng cách sử dụng Object.keys(), nhưng một phương thức được đặt tên có thể dẫn đến xung đột với một trong các giá trị của enum, chưa nói đến phương thức làm ô nhiễm kết quả

Sử dụng ký hiệu ES6 là giải pháp rõ ràng ở đây, vì nó sẽ không làm ô nhiễm kết quả của Object.keys() và nó sẽ không bao giờ xung đột với bất kỳ giá trị nào trong enum. Tiến thêm một bước nữa, Symbol.iterator sẽ là một lựa chọn tuyệt vời vì nó sẽ cho phép enum được coi là có thể lặp lại và làm cho nó trở nên hữu ích hơn. Đặt tất cả những thứ này lại với nhau, đây là lớp Enum của tôi và cách sử dụng nó

Enum là một kiểu dữ liệu trong các ngôn ngữ lập trình xác định một tập hợp các giá trị không đổi. Nó là một loại giá trị riêng biệt (i. e) tất cả các giá trị trong một enum là duy nhất. Sử dụng một enum làm cho mã có thể đọc được và có thể bảo trì được. Một số ví dụ về enum là tất cả các ngày trong tuần từ thứ 2 đến chủ nhật, size áo thun như S, M, L, XL, v.v.

Mã giả của một biến enum có thể trông giống như bên dưới

enum Direction {
    NORTH,
    EAST,
    WEST,
    SOUTH
}

JavaScript có hỗ trợ Enum không?

Mặc dù kiểu dữ liệu enum được sử dụng rộng rãi trong nhiều ngôn ngữ lập trình như C++, Java, v.v. , Javascript không có kiểu dữ liệu enum tích hợp. Các chức năng của Enum có thể được triển khai trong Javascript bằng cách sử dụng các lớp và đối tượng

Các cách triển khai Enum trong Javascript

Enum sử dụng các đối tượng

Enums có thể được triển khai trong Javascript bằng cách sử dụng các đối tượng. Đối tượng có thể có các cặp khóa-giá trị trong đó khóa có thể được coi là giá trị enum và vấn đề có thể là bất kỳ thứ gì

cú pháp

const objectName = {
    key1: value1,
    key2: value2,
    ....
}

Thí dụ

Hãy sử dụng một đối tượng Javascript để triển khai một enum cho các hướng như bắc, đông, tây và nam

const Direction = {
  North: 'north',
  East: 'east',
  West: 'west',
  South: 'south',
}

Một vấn đề với việc triển khai ở trên là các giá trị trong đối tượng Hướng có thể thay đổi. Vì enums là bất biến, chúng ta có thể đạt được tính bất biến bằng cách đóng băng đối tượng bằng Object. phương thức đóng băng ()

đối tượng. Phương thức freeze() đóng băng một đối tượng nghĩa là không thể thêm các thuộc tính mới, các thuộc tính hiện có và nguyên mẫu của đối tượng không thể được gán lại

// Frozen enum - Immutable
const Direction = Object.freeze({
  North: 'north',
  East: 'east',
  West: 'west',
  South: 'south',
})

Các giá trị có thể được truy cập dòng dưới đây

var input = Direction.North

if (input == Direction.North) {
  console.log('Move Up')
}

Enum sử dụng các ký hiệu

Một vấn đề chúng ta thấy với cách tiếp cận trên là va chạm (i. e. ) giá trị của một đối tượng có thể xung đột với giá trị của đối tượng khác. Hãy hiểu nó với Hướng và Cực của enums

const Direction = Object.freeze({
  North: 'north',
  East: 'east',
  West: 'west',
  South: 'south',
})

const Pole = Object.freeze({
  North: 'north',
  South: 'south',
})

console.log(Direction.North === Pole.North)

Đầu ra của đoạn mã trên sẽ là

Mặc dù hướng Bắc và cực Bắc là các trường hợp enum khác nhau, nhưng chúng được đối xử bình đẳng. Biểu tượng có thể được sử dụng để khắc phục vấn đề này

Biểu tượng là một đối tượng tích hợp có hàm tạo trả về một giá trị được đảm bảo là duy nhất. Hãy sử dụng các ký hiệu để thực hiện Hướng và Cực enum

const Direction = Object.freeze({
  North: Symbol('north'),
  East: Symbol('east'),
  West: Symbol('west'),
  South: Symbol('south'),
})

const Pole = Object.freeze({
  North: Symbol('north'),
  South: Symbol('south'),
})

console.log(Direction.North === Pole.North)

Đầu ra của đoạn mã trên là

Đoạn mã trên trả về false vì các giá trị của đối tượng Hướng và đối tượng Cực khác nhau vì Biểu tượng trả về các giá trị duy nhất


Enum sử dụng các lớp

Enums có thể được triển khai bằng cách sử dụng các lớp Javascript, trong đó mỗi giá trị sẽ là thể hiện tĩnh của chính lớp đó nhưng với các giá trị khác nhau

Làm cách nào để truy cập giá trị enum trong JavaScript?

Bảng liệt kê JavaScript .
Nhận tất cả các giá trị enum được phép. Mục tiêu. keys(Direction) trả về một mảng ['Up', 'Down', 'Left', 'Right']
Kiểm tra xem một giá trị có bằng giá trị enum không. val === Hướng. Lên
Kiểm tra xem một giá trị có trong enum không. Phương hướng. hasOwnProperty('Up')

Làm cách nào để đặt giá trị enum trong JavaScript?

Trong chiến lược cuối cùng, chúng ta cũng có thể cập nhật giá trị cho một loại enum chỉ bằng cách gán một giá trị mới cho nó . Để hạn chế cập nhật enum, chúng ta có thể làm cho nó trở nên bất biến bằng cách truyền đối tượng vào bên trong Object. phương thức đóng băng (). Hãy để chúng tôi xem đây là một ví dụ.

Chúng ta có thể sử dụng enum trong JavaScript không?

Hãy nghĩ về Enums như một loại lớp đóng, các thể hiện của nó được xác định trước một cách tĩnh. Tuy nhiên, có một vấn đề nhỏ — Các enum không được hỗ trợ trong JavaScript nguyên bản . Tuy nhiên, vì Enum là một mẫu nên nó có thể được sao chép thông qua một số kỹ thuật và tính năng của JavaScript gốc.

Làm cách nào để lấy khóa enum từ giá trị trong JavaScript?

Đơn giản là. var val = StateValue[stateVal]; Bạn có thể truy cập các thuộc tính đối tượng bằng ký hiệu ngoặc.