Mặc dù các biểu tượng là nguyên thủy, nhưng chúng cũng giống như các đối tượng ở chỗ mỗi giá trị được tạo bởi
const sym = Symbol[];
assert.equal[typeof sym, 'symbol'];
7 là duy nhất và không được so sánh theo giá trị> Symbol[] === Symbol[]
false
Trước các biểu tượng, các đối tượng là lựa chọn tốt nhất nếu chúng ta cần các giá trị duy nhất [chỉ bằng chính chúng]
const string1 = 'abc';
const string2 = 'abc';
assert.equal[
string1 === string2, true]; // not unique
const object1 = {};
const object2 = {};
assert.equal[
object1 === object2, false]; // unique
const symbol1 = Symbol[];
const symbol2 = Symbol[];
assert.equal[
symbol1 === symbol2, false]; // unique
22. 2 Mô tả ký hiệu
Tham số chúng ta chuyển đến chức năng xuất xưởng của biểu tượng cung cấp mô tả cho biểu tượng đã tạo
const mySymbol = Symbol['mySymbol'];
Mô tả có thể được truy cập theo hai cách
Đầu tiên, nó là một phần của chuỗi được trả về bởi
> Symbol[] === Symbol[]
false
0assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
Thứ hai, kể từ ES2019, chúng tôi có thể truy xuất mô tả thông qua thuộc tính
> Symbol[] === Symbol[]
false
1assert.equal[mySymbol.description, 'mySymbol'];
22. 3 Các trường hợp sử dụng cho ký hiệu
Các trường hợp sử dụng chính cho các biểu tượng, là
- Giá trị cho hằng số
- Khóa thuộc tính duy nhất
22. 3. 1 Các ký hiệu làm giá trị cho hằng số
Giả sử bạn muốn tạo các hằng số đại diện cho các màu đỏ, cam, vàng, lục, lam và tím. Một cách đơn giản để làm như vậy là sử dụng chuỗi
Về mặt tích cực, việc ghi nhật ký hằng số đó tạo ra đầu ra hữu ích. Về mặt trừ, có nguy cơ nhầm một giá trị không liên quan với một màu vì hai chuỗi có cùng nội dung được coi là bằng nhau
________số 8
Chúng tôi có thể khắc phục vấn đề đó thông qua các biểu tượng
const COLOR_BLUE = Symbol['Blue'];
const MOOD_BLUE = Symbol['Blue'];
assert.notEqual[COLOR_BLUE, MOOD_BLUE];
Hãy sử dụng các hằng số có giá trị ký hiệu để triển khai một hàm
> Symbol[] === Symbol[]
false
022. 3. 2 Symbols là khóa thuộc tính duy nhất
Các khóa của thuộc tính [trường] trong đối tượng được sử dụng ở hai cấp độ
Chương trình hoạt động ở mức cơ sở. Các khóa ở cấp độ đó phản ánh miền vấn đề - lĩnh vực mà chương trình giải quyết vấn đề - ví dụ:
- Nếu một chương trình quản lý nhân viên, các khóa thuộc tính có thể là về chức danh công việc, loại lương, ID bộ phận, v.v.
- Nếu chương trình là một ứng dụng cờ vua, các khóa thuộc tính có thể là về quân cờ, bàn cờ, màu sắc của người chơi, v.v.
ECMAScript và nhiều thư viện hoạt động ở cấp độ meta. Họ quản lý dữ liệu và cung cấp các dịch vụ không phải là một phần của miền sự cố – ví dụ
Phương thức tiêu chuẩn
0 được ECMAScript sử dụng khi tạo biểu diễn chuỗi của một đối tượng [dòng A]> Symbol[] === Symbol[] false
0const sym = Symbol[]; assert.equal[typeof sym, 'symbol'];
3 và> Symbol[] === Symbol[] false
4 là các thuộc tính cấp cơ sở – chúng được sử dụng để giải quyết vấn đề tính toán với điểm.> Symbol[] === Symbol[] false
0 là thuộc tính siêu cấp – nó không liên quan gì đến miền có vấn đề> Symbol[] === Symbol[] false
Phương pháp ECMAScript tiêu chuẩn
6> Symbol[] === Symbol[] false
1const sym = Symbol[]; assert.equal[typeof sym, 'symbol'];
3 và> Symbol[] === Symbol[] false
4 là thuộc tính cấp cơ sở,> Symbol[] === Symbol[] false
6 là thuộc tính cấp meta> Symbol[] === Symbol[] false
Cấp độ cơ sở và cấp độ meta của chương trình phải độc lập. Các khóa thuộc tính cấp cơ sở không được xung đột với các khóa thuộc tính cấp meta
Nếu chúng ta sử dụng tên [chuỗi] làm khóa thuộc tính, chúng ta sẽ đối mặt với hai thách thức
Khi một ngôn ngữ được tạo lần đầu tiên, nó có thể sử dụng bất kỳ tên siêu cấp nào mà nó muốn. Mã cấp cơ sở buộc phải tránh những tên đó. Tuy nhiên, sau này, khi đã có nhiều mã cấp cơ sở, các tên cấp meta không thể được chọn tự do nữa.
Chúng tôi có thể đưa ra các quy tắc đặt tên để phân tách cấp độ cơ sở và cấp độ meta. Ví dụ: Python đặt tên cấp meta trong ngoặc với hai dấu gạch dưới.
0,const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
1,const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
2, v.v. Tuy nhiên, tên siêu cấp của ngôn ngữ và tên siêu cấp của thư viện sẽ vẫn tồn tại trong cùng một không gian tên và có thể xung độtconst string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
Đây là hai ví dụ về nơi cái sau là một vấn đề đối với JavaScript
Vào tháng 5 năm 2018, phương thức Mảng
3 phải được đổi tên thànhconst string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
4 vì tên cũ đã được các thư viện sử dụng [nguồn]const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
Vào tháng 11 năm 2020, phương thức Mảng
5 phải được đổi tên thànhconst string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
6 vì tên cũ đã được thư viện sử dụng [nguồn]const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
Các ký hiệu, được sử dụng làm khóa thuộc tính, hãy giúp chúng tôi tại đây. Mỗi ký hiệu là duy nhất và một phím ký hiệu không bao giờ xung đột với bất kỳ chuỗi hoặc phím ký hiệu nào khác
22. 3. 2. 1 Ví dụ. một thư viện với phương thức siêu cấpVí dụ: giả sử chúng ta đang viết một thư viện xử lý các đối tượng khác nhau nếu chúng triển khai một phương thức đặc biệt. Đây là cách xác định khóa thuộc tính cho một phương thức như vậy và triển khai nó cho một đối tượng sẽ như thế nào
const sym = Symbol[];
assert.equal[typeof sym, 'symbol'];
2Dấu ngoặc vuông trong dòng A cho phép chúng tôi chỉ định rằng phương thức phải có khóa
const string1 = 'abc';
const string2 = 'abc';
assert.equal[
string1 === string2, true]; // not unique
const object1 = {};
const object2 = {};
assert.equal[
object1 === object2, false]; // unique
const symbol1 = Symbol[];
const symbol2 = Symbol[];
assert.equal[
symbol1 === symbol2, false]; // unique
7. Thông tin chi tiết được giải thích trong §28. 7. 2 “Các khóa được tính toán theo nghĩa đen của đối tượng”22. 4 Các biểu tượng được biết đến rộng rãi
Các ký hiệu đóng vai trò đặc biệt trong ECMAScript được gọi là các ký hiệu đã biết công khai. Những ví dụ bao gồm
8. làm cho một đối tượng có thể lặp lại. Đó là chìa khóa của một phương thức trả về một trình vòng lặp. Để biết thêm thông tin về chủ đề này, hãy xem §30 “Lặp lại đồng bộ”const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
9. tùy chỉnh cách hoạt động củaconst string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
0. Nếu một đối tượng triển khai một phương thức với khóa đó, nó có thể được sử dụng ở phía bên tay phải của toán tử đó. Ví dụconst mySymbol = Symbol['mySymbol'];
3const sym = Symbol[]; assert.equal[typeof sym, 'symbol'];
1. ảnh hưởng đến phương thứcconst mySymbol = Symbol['mySymbol'];
0 mặc định> Symbol[] === Symbol[] false
4const sym = Symbol[]; assert.equal[typeof sym, 'symbol'];
Ghi chú. Tốt hơn hết là ghi đè lên
0> Symbol[] === Symbol[] false
bài tập. Biểu tượng được biết đến rộng rãi
1.const mySymbol = Symbol['mySymbol'];
5const mySymbol = Symbol['mySymbol'];
9.const string1 = 'abc'; const string2 = 'abc'; assert.equal[ string1 === string2, true]; // not unique const object1 = {}; const object2 = {}; assert.equal[ object1 === object2, false]; // unique const symbol1 = Symbol[]; const symbol2 = Symbol[]; assert.equal[ symbol1 === symbol2, false]; // unique
7const mySymbol = Symbol['mySymbol'];
22. 5 Chuyển đổi ký hiệu
Điều gì xảy ra nếu chúng ta chuyển đổi một ký hiệu
const mySymbol = Symbol['mySymbol'];
8 sang một kiểu nguyên thủy khác? . 15 đã có đáp ánBảng 15. Kết quả của việc chuyển đổi các ký hiệu sang các loại nguyên thủy khác. boolean
const mySymbol = Symbol['mySymbol'];
9 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OKassert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
1 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OKnumberassert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
3 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
6 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5stringassert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
9 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OKassert.equal[mySymbol.description, 'mySymbol'];
1 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5assert.equal[mySymbol.description, 'mySymbol'];
4 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OKassert.equal[mySymbol.description, 'mySymbol'];
6 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5Một cạm bẫy quan trọng với các biểu tượng là tần suất các ngoại lệ được đưa ra khi chuyển đổi chúng sang một thứ khác. Suy nghĩ đằng sau đó là gì? . Thứ hai, chuyển đổi một ký hiệu thành một chuỗi thực sự hữu ích cho đầu ra chẩn đoán. Nhưng cũng nên cảnh báo về việc vô tình biến một biểu tượng thành một chuỗi [là một loại khóa thuộc tính khác]
const sym = Symbol[];
assert.equal[typeof sym, 'symbol'];
5Nhược điểm là các ngoại lệ làm cho việc làm việc với các ký hiệu trở nên phức tạp hơn. Bạn phải chuyển đổi rõ ràng các ký hiệu khi lắp ráp các chuỗi thông qua toán tử dấu cộng