Bản dịch này chưa hoàn thành. Xin hãy giúp dịch bài viết này từ tiếng Anh.

Trong JavaScript, giá trị sơ khai (giá trị sơ khai, kiểu dữ liệu sơ khai) là dữ liệu không phải object và không có phương thức. Có 6 kiểu dữ liệu sơ khai: string, number, boolean, null, undefined, symbol (mới thêm vào trong ECMAScript 2015).

Most of the time, a primitive value is represented directly at the lowest level of the language implementation.

Mọi giá trị sơ khai đều là bất biến, tức là không thể bị thay đổi. Đừng để bối rối giữa một giá trị sơ khai với một biến được gán giá trị sơ khai. Biến đó có thể được gán lại giá trị mới, nhưng giá trị đang tồn tại không thể bị thay đổi như object, mảng và hàm.

Ví dụ

Ví dụ này sẽ giúp bạn hiểu rõ nguyên lý bất biến của giá trị sơ khai

JavaScript

// Sử dụng phương thức chuỗi không làm thay đổi chuỗi
var bar = "baz";
console.log(bar);               // baz
bar.toUpperCase();
console.log(bar);               // baz

// Sử dụng phương thức mảng không làm thay đổi mảng
var foo = [];
console.log(foo);               // []
foo.push("plugh");
console.log(foo);               // ["plugh"]

// Gán giá trị cho giá trị sơ khai giá trị mới (không phải thay đổi nó)
bar = bar.toUpperCase();       // BAZ

Giá trị sơ khai có thể được thay thế, nhưng không thể được thay đổi trực tiếp.

Ví dụ khác [ Từng-bước ]

Ví dụ sau đây sẽ cho bạn thấy cách JavaScript làm việc với giá trị sơ khai.

JavaScript

// Giá trị sơ khai
let foo = 5;

// Định nghĩa hàm thay đổi giá trị sơ khai
function addTwo(num) {
   num += 2;
}
// Một hàm khác làm điều tương tự
function addTwo_v2(foo) {
   foo += 2;
}

// Gọi hàm thứ nhất và truyền giá trị sơ khai vào tham số
addTwo(foo);
// Trả về giá trị sơ khai
console.log(foo);   // 5

// Làm tương tự với hàm thứ hai
addTwo_v2(foo);
console.log(foo);   // 5

Bạn có đang nghĩ rằng đó phải là 7 chứ không phải 5 không? Nếu có, dưới đây là cách đoạn mã hoạt động:

  • Cả hai lời gọi hàm addTwoaddTwo_v2, JavaScript tra cứu giá trị cho định danh foo. JavaScript tìm được đúng thể hiện biến trong dòng lệnh đầu tiên
  • Sau khi tìm thấy rồi, JavaScript truyền đối số tới hàm thông qua tham số
  • Trước khi thực thi các lệnh trong thân hàm, JavaScript sao chép đối số gốc được truyền vào (là giá trị sơ khai) và tạo ra một bản sao cục bộ. Các bản sao này, chỉ tồn tại trong phạm vi hàm, được truy nhập tới bằng các định danh ta đặc tả trong lúc định nghĩa hàm (num cho addTwo, foo cho addTwo_v2)
  • Sau đó, các lệnh trong thân hàm được thực thi:
    • Trong hàm thứ nhất, biến cục bộ num được khởi tạo. Ta tăng giá trị của nó thêm 2, không phải giá trị gốc của foo!
    • Trong hàm thứ hai, biến cục bộ foo được khởi tạo. Ta tăng giá trị của nó thêm 2, không phải giá trị gốc (nằm bên ngoài hàm) của foo! Ngoài ra, trong trường hợp này, biến ngoài hàm foo không thể được truy nhập theo bất cứ cách nào. Đó là tại JavaScript's lexical scoping và the resulting variable shadowing. Biến cục bộ foo che giấu cho biến ngoài hàm foo. Để biết thêm chi tiết, tham khảo Closures.
  • Tóm lại, mọi thay đổi trong hàm sẽ không ảnh hưởng giá trị GỐC của foo, bởi ta đang làm việc dựa trên bản sao copies của nó

Đó là lý do tại sao giá trị sơ khai bất biến. Bởi vì, ta không làm việc trực tiếp với chúng, ta sao chép chúng và làm việc với bản sao chép đó, thay vì sử dụng bản gốc.

Object bọc giá trị sơ khai trong JavaScript

Ngoại trừ nullundefined, mọi giá trị sơ khai đều được bọc bởi object tương ứng:

  • String cho giá trị chuỗi sơ khai.
  • Number cho giá trị số sơ khai.
  • Boolean cho giá trị boolean sơ khai.
  • Symbol cho giá trị symbol sơ khai.

Phương thức valueOf() trả về giá trị sơ khai.

Tham khảo thêm

Hiểu biết chung

Document Tags and Contributors

Những người đóng góp cho trang này: PurpleLover
Cập nhật lần cuối bởi: PurpleLover,