12/08/2018, 16:23

Effective JavaScript - Chapter 1 - Accustoming Yourself to JavaScript (Part VI)

JavaScript được thiết kế để mang lại cảm giác quen thuộc. Với cú pháp (syntax) gợi nhớ về Java và hàm dựng vốn dĩ đã phổ biến ở rất nhiều ngôn ngữ scripting (function, array, dictionary và regular expression), JavaScript dường như là một cái gì đó dễ học với bất cứ ai đã có một chút kinh nghiệm về ...

JavaScript được thiết kế để mang lại cảm giác quen thuộc. Với cú pháp (syntax) gợi nhớ về Java và hàm dựng vốn dĩ đã phổ biến ở rất nhiều ngôn ngữ scripting (function, array, dictionary và regular expression), JavaScript dường như là một cái gì đó dễ học với bất cứ ai đã có một chút kinh nghiệm về programming. Và với các programmer ít kinh nghiệm, họ có thể bắt đầu viết các chương trình mà không cần training quá nhiều tại vì lượng khái niệm core trong JavaScript là không quá nhiều.

Việc tiếp cận tuy dễ dàng, nếu muốn thuần thục (master) nó thì sẽ mất khá nhiều thời gian và đòi hỏi sự hiểu biết sâu hơn về ngữ nghĩa, các đặc tính và các idiom hữu hiệu nhất của nó. Mỗi chapter của cuốn sách này sẽ đề cập đến một phạm vi chủ đề khác nhau của effective JavaScript. Chương đầu tiên này bắt đầu với một vài topic cơ bản nhất.

Unicode nổi tiếng là phức tạp - mặc dù string xuất hiện ở khắp mọi nơi, đa số các lập trình viên tránh tìm hiểu về Unicode và hy vọng về những điều tốt nhất đến với họ. Nhưng ở mức khái niệm, chẳng có gì để phải lo lắng cả. Mục đích (basics) của Unicode đơn giản chỉ là: Mỗi đơn vị văn bản (unit of text) của tất cả các hệ thống chữ viết trên thế giới đều được quy về một số tự nhiên duy nhất trong khoảng 0 đến 1,114,111. Những giá trị này được gọi là điểm mã (code point) trong thuật ngữ Unicode. Unicode hầu như không có gì khác so với các cách mã hóa văn bản khác như là ASCII. Tuy nhiên, điểm khác biệt chính là trong ASCII map mỗi chỉ mục (index) với một biểu diễn nhị phân duy nhất, Unicode lại cho phép đa mã hóa nhị phân khác nhau cho các điểm mã. Các cách mã hóa khác đánh đổi giữa dung lượng bộ nhớ cần cho một string và tốc độ xử lý các thao tác trên string đó. Ngày nay, có nhiều chuẩn Unicode khác nhau. Tuy nhiên UTF-8, UTF-16 và UTF-32 được sử dụng phổ biến nhất.

Trong quá khứ, những người thiết kế ra Unicode đã tính toán nhầm ngân sách (budget) cho các điểm mã. Ban đầu thì họ nghĩ rằng Unicode không cần quá 2^16 điểm mã. Đây chính là UCS-2, bộ mã hóa 16-bit thuở sơ khai. Bởi vì mỗi điểm mã có thể gắn với một số 16-bit, sẽ có một mapping một - một giữa các điểm mã và các phần tử của bảng mã - hay còn gọi là đơn vị mã (code unit). Lợi ích chính của các mã hóa này chính là ở việc đánh chỉ mục cho một string: tốn ít thời gian và bất biến. Việc truy cập vào điểm mã thứ n của một string đơn thuần chỉ là lấy ra phần tử 16-bit thứ n của mảng. Hình 1.1 thể hiện một string mẫu, chỉ gồm các điểm mã trong dải 16-bit ban đầu. Như bạn có thể thấy, các chỉ mục ăn khớp giữa các phần tử của bảng mã và các điểm mã trong string.

Hình 1.1 Một string JavaScript chứa các điểm mã từ mặt đa ngôn ngữ cơ bản (Basic Multilingual Plane - BMP)

Kết quả là một số nền tảng đã cam kết sử dụng chuẩn mã hóa 16-bit. Java và JavaScript là hai trong số đó. Hiện nay, nếu Unicode giữ nguyên như những năm đầu của thập niên 90, mỗi phần tử của một string JavaScript vẫn sẽ tương ứng với một điểm mã đơn.

Dải 16-bit này thực sự lớn, có thể bao hàm nhiều hơn rất nhiều các hệ thống văn bản so với ASCII. Mặc dù vậy, sau cùng thì Unicode đã phát triển vượt quá dải ban đầu của nó và hiện tại thì đã vượt ngưỡng 2^20 điểm mã. Dải mới này được chia thành 17 dải con gồm 2^16 điểm mã. Đầu tiên trong số này, mặt đa ngôn ngữ cơ bản (BMP), gồm 2^16 điểm mã thuở sơ khai. 16 dải mới thêm vào được gọi là các mặt bổ sung (supplementary plane).

Từ khi dải điểm mã phồng ra, UCS-2 đã trở nên lỗi thời: Nó cần được mở rộng để biểu diễn các điểm mã mới. Người kế nhiệm của nó, UTF-16, cũng gần giống như vậy, trừ sự xuất hiện của surrogate pair (cặp thay thế): Các cặp đơn vị mã 16-bit cùng nhau mã hóa một điểm mã đơn 2^16 hoặc lớn hơn. Ví dụ, khóa Sol (music symbol G-clef)

0