Nhảy tới nội dung

Kiểu symbol

Kiểu symbol trong JavaScript là một loại primitive type, giá trị của nó là duy nhất. Kiểu boolean hay kiểu number nếu giá trị giống nhau thì so sánh bằng sẽ là true. Ngược lại, symbol ngay cả khi tên giống nhau nhưng nơi khởi tạo khác nhau thì sẽ là false.

js
const s1 = Symbol("foo");
const s2 = Symbol("foo");
console.log(s1 === s1);
true
console.log(s1 === s2);
false
js
const s1 = Symbol("foo");
const s2 = Symbol("foo");
console.log(s1 === s1);
true
console.log(s1 === s2);
false

Ruby cũng có type tên là symbol. Symbol của Ruby nếu giá trị giống nhau thì so sánh bằng sẽ là true dù viết ở vị trí khác nhau.

ruby
# Ruby code
s1 = :foo
s2 = :foo
p s1 == s2 #=> true
ruby
# Ruby code
s1 = :foo
s2 = :foo
p s1 == s2 #=> true

Ngược lại, JavaScript như đã nói ở trên, được quyết định bởi nơi khởi tạo symbol, nên những người từ Ruby chuyển sang cần chú ý. Điều tương tự symbol của Ruby, trong JavaScript hay TypeScript được giải quyết bằng chuỗi.

Type annotation của symbol

Type annotation của symbol trong TypeScript dùng symbol.

ts
const s: symbol = Symbol();
ts
const s: symbol = Symbol();

Lưu ý khi dùng kiểu symbol

Truyền kiểu symbol trực tiếp vào JSON.stringify() sẽ trả về undefined.

ts
console.log(JSON.stringify(Symbol("many")));
undefined
ts
console.log(JSON.stringify(Symbol("many")));
undefined

Ngoài ra, truyền object chứa kiểu symbol trong property vào JSON.stringify(), key chứa kiểu symbol trong property sẽ biến mất.

ts
console.log(
JSON.stringify({
x: Symbol("many"),
y: "hello",
})
);
{ "y": "hello" }
ts
console.log(
JSON.stringify({
x: Symbol("many"),
y: "hello",
})
);
{ "y": "hello" }

Tương tự, truyền object chứa kiểu symbol làm key vào JSON.stringify(), key là kiểu symbol sẽ biến mất.

ts
console.log(
JSON.stringify({
[Symbol("many")]: "hello",
y: "hello",
})
);
{ "y": "hello" }
ts
console.log(
JSON.stringify({
[Symbol("many")]: "hello",
y: "hello",
})
);
{ "y": "hello" }

Mục đích của symbol

Động cơ đưa symbol vào JavaScript là để thêm API mới mà không phá vỡ backward compatibility của built-in API của JavaScript. Tóm lại, được đưa vào để dễ dàng update bản thân JavaScript. Do đó, giới hạn trong trường hợp phát triển application, cơ hội viết code sử dụng nhiều symbol không nhiều lắm.