Nhiều hướng dẫn về phong cách JavaScript đề xuất viết hoa tên hằng. Cá nhân tôi hiếm khi thấy quy ước này được sử dụng ở nơi mà tôi nghĩ nó nên được sử dụng. Điều này là do định nghĩa của tôi về hằng số hơi sai. Tôi quyết định tìm hiểu thêm một chút và trở nên quen thuộc hơn một chút với quy ước này.
Chúng ta định nghĩa thuật ngữ “hằng số” như thế nào?
Trong lập trình, hằng số là thứ không thay đổi.
Đó là một giá trị mà chương trình không thể thay đổi trong quá trình thực thi bình thường.
Vậy JavaScript có cung cấp cho chúng ta cách khai báo một giá trị không thể thay đổi không? Trước khi chúng tôi trả lời điều này, chúng ta hãy nhìn vào nguồn gốc của quy ước này.
Quy ước viết hoa có nguồn gốc từ C
C là một ngôn ngữ được biên dịch. Điều này có nghĩa là một chương trình khác sẽ chuyển đổi tất cả mã của bạn thành mã máy trước khi chạy.
Mặt khác, JavaScript là một ngôn ngữ được giải thích. Trình thông dịch đọc mã của bạn, từng dòng một, khi mã chạy.
Sự khác biệt giữa biên dịch và thông dịch đóng một vai trò trong cách chúng ta khai báo các giá trị không đổi trong C.
Trong C, tôi có thể khai báo một biến như thế này:
int hoursInDay = 24;
Hoặc, một hằng số như thế này:
#define hoursInDay 24
Ví dụ thứ hai được gọi là hằng số tượng trưng. Hằng ký hiệu có thể là một dãy ký tự, một hằng số hoặc một chuỗi. Đây cũng được gọi là giá trị nguyên thủy. Các giá trị nguyên thủy trong JavaScript là chuỗi, số, booleans, null, không xác định, ký hiệu (đừng nhầm với hằng ký hiệu) và int lớn.
Bây giờ, hãy xem lại quá trình biên dịch.
Trước khi biên dịch, có một giai đoạn tiền biên dịch. Ở đây, trình biên dịch trước thay thế tất cả các trường hợp của hằng ký hiệu bằng giá trị tương ứng. Trình biên dịch không bao giờ biết rằng lập trình viên đã viết hoursInDay
. Nó chỉ nhìn thấy số 24
.
Viết hoa giúp lập trình viên thấy những giá trị thực sự không đổi này.
#define HOURS_IN_DAY 24
Hằng số JavaScript khác với hằng số tượng trưng
Trước ES6, chúng tôi đã lưu trữ hầu hết các giá trị trong các biến, ngay cả những giá trị mà bạn muốn không đổi.
Viết hoa giúp chúng tôi thấy các giá trị mà chúng tôi muốn duy trì không đổi.
var HOURS_IN_DAY = 24;
var hoursRemaining = currentHour - HOURS_IN_DAY;
var MY_NAME = 'Brandon';
MY_NAME = ... // oops don't want to do this.
ES6 đã giới thiệu khai báo const
đó không phải là một “hằng số” theo nghĩa thuần túy nhất.
ES6 đã thêm các điều khoản const
và let
như những cách để tạo ra các biến với các mục đích khác nhau.
Với hai thuật ngữ đó, bạn có thể nghĩ rằng chúng tôi:
- không cần viết hoa bất cứ thứ gì vì chúng ta có thể thấy rõ biến nào được dự định giữ nguyên hoặc
- chúng ta nên viết hoa mọi thứ mà chúng ta khai báo với
const
.
Theo định nghĩa, const
tạo một hằng số là tham chiếu chỉ đọc cho một giá trị. Điều này không có nghĩa là giá trị mà nó nắm giữ là bất biến. Nó chỉ nói rằng mã định danh biến không thể được chỉ định lại.
Nói cách khác, một số const
tài liệu tham khảo có thể thay đổi.
const firstPerson = {
favoriteNumber: 10,
};
const secondPerson = firstPerson;
console.log(secondPerson.favoriteNumber); //10
firstPerson.favoriteNumber +=1;
console.log(secondPerson.favoriteNumber); //11
Ví dụ trên cho thấy khai báo const
không đảm bảo rằng biến đó là bất biến.
const
chỉ ngăn chúng ta cố gán lại tên biến. Nó không ngăn thuộc tính đối tượng thay đổi. Hãy nhớ rằng: các đối tượng là tham chiếu qua.
// "TypeError: Assignment to constant variable."secondPerson = 'something else';
const secondPerson = 'Me'
secondPerson = 'something else';
Vì vậy, đối với JavaScript, chúng ta không chỉ đơn thuần tìm kiếm một const
tuyên ngôn. Chúng ta cần đặt hai câu hỏi để xác định xem một biến có phải là hằng số hay không:
- Là giá trị của biến nguyên thủy?
- Chúng ta có định giữ tên biến chỉ cùng một giá trị trong suốt chương trình của mình không?
Nếu câu trả lời là có cho cả hai, chúng ta nên khai báo biến với const
và có thể viết hoa tên.
Lưu ý rằng tôi đã nói “có thể.” Tinh thần của quy ước này xuất phát từ các ngôn ngữ khác nhau có hằng số thực tế. JavaScript thì không. Ít nhất là theo nghĩa thuần túy nhất. Đây có thể là lý do tại sao bạn thấy quy ước này ít thường xuyên hơn bạn mong đợi. Airbnb có một phần tuyệt vời trong hướng dẫn phong cách của họ ở đây.
Các chìa khóa rút ra là nhận ra việc xác định một hằng số trong JavaScript phải bao gồm ý định của lập trình viên.
Ngoài ra, không phải mọi quy ước từ một ngôn ngữ đều có ý nghĩa trong một ngôn ngữ khác. Cuối cùng, tôi chỉ có thể tưởng tượng rằng nhiều quy ước đã được sử dụng từ rất lâu trước khi các IDE có khả năng như ngày nay. Tôi tin rằng IDE của tôi rất vui khi nói với tôi rằng tôi đã sai. Nó xảy ra rất nhiều.
Cảm ơn vì đã đọc!
woz
theo tôi trên Twitter.
ghi chú
- Bạn có thể thắc mắc tại sao tôi không sử dụng
PI
trong bất kỳ ví dụ nào trong số này. Từ viết tắt – đặc biệt là từ viết tắt gồm hai chữ cái – có xu hướng luôn được viết hoa hoặc luôn viết thường theo quy ước.