Biểu tượng JavaScript thành chuỗi

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
0

assert.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
1

assert.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
0

22. 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

      > Symbol[] === Symbol[]
      false
      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]

      const sym = Symbol[];
      assert.equal[typeof sym, 'symbol'];
      0

      > Symbol[] === Symbol[]
      false
      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 đề

    • Phương pháp ECMAScript tiêu chuẩn

      > Symbol[] === Symbol[]
      false
      6

      const sym = Symbol[];
      assert.equal[typeof sym, 'symbol'];
      1

      > Symbol[] === Symbol[]
      false
      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

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.

    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
    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 đột

Đâ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

    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
    3 phải được đổi tên thành
    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
    4 vì tên cũ đã được các thư viện sử dụng [nguồn]

  • Vào tháng 11 năm 2020, phương thức Mả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
    5 phải được đổi tên thành
    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
    6 vì tên cũ đã được thư viện sử dụng [nguồn]

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ấp

Ví 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'];
2

Dấ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

  • 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
    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ủa
    const mySymbol = Symbol['mySymbol'];
    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 sym = Symbol[];
    assert.equal[typeof sym, 'symbol'];
    3

  • const mySymbol = Symbol['mySymbol'];
    1. ảnh hưởng đến phương thức
    > Symbol[] === Symbol[]
    false
    0 mặc định

    const sym = Symbol[];
    assert.equal[typeof sym, 'symbol'];
    4

    Ghi chú. Tốt hơn hết là ghi đè lên

    > Symbol[] === Symbol[]
    false
    0

bài tập. Biểu tượng được biết đến rộng rãi

  • const mySymbol = Symbol['mySymbol'];
    1.
    const mySymbol = Symbol['mySymbol'];
    5
  • 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.
    const mySymbol = Symbol['mySymbol'];
    7

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

Bả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 OK
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
1
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OKnumber
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
3
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
6
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5string
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
9
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OK
assert.equal[mySymbol.description, 'mySymbol'];
1
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5
assert.equal[mySymbol.description, 'mySymbol'];
4
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0 OK
assert.equal[mySymbol.description, 'mySymbol'];
6
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
0
assert.equal[mySymbol.toString[], 'Symbol[mySymbol]'];
5

Mộ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'];
5

Nhượ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

Làm cách nào để chuyển đổi biểu tượng thành chuỗi trong JavaScript?

Để xâu chuỗi một ký hiệu, bạn phải gọi rõ ràng phương thức toString[] của nó hoặc sử dụng hàm String[] .

Chúng ta có thể sử dụng biểu tượng trong JavaScript không?

Các biểu tượng đã được thêm vào dòng các loại dữ liệu nguyên thủy trong JavaScript vào năm 2015 . Nó là một phần của đặc tả ES6 và mục đích duy nhất của nó là hoạt động như một mã định danh duy nhất của các thuộc tính đối tượng, tôi. e. nó có thể được sử dụng như một chìa khóa trong các đối tượng.

toString 36 trong JavaScript là gì?

Tham số này chỉ định cơ số mà số nguyên được biểu diễn trong chuỗi . Nó là một số nguyên nằm trong khoảng từ 2 đến 36 được sử dụng để chỉ định cơ sở biểu diễn các giá trị số. Giá trị trả về. nữ tu. Phương thức toString[] trả về một chuỗi đại diện cho đối tượng số đã chỉ định.

Chủ Đề