Symbol.toPrimitive
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
Thuộc tính dữ liệu tĩnh Symbol.toPrimitive đại diện cho well-known symbol Symbol.toPrimitive. Tất cả các thuật toán ép kiểu tra cứu symbol này trên các đối tượng cho phương thức chấp nhận kiểu ưu tiên và trả về một biểu diễn nguyên thủy của đối tượng, trước khi quay lại dùng các phương thức valueOf() và toString() của đối tượng.
Try it
const object = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 42;
}
return null;
},
};
console.log(+object);
// Expected output: 42
Giá trị
Well-known symbol Symbol.toPrimitive.
Property attributes of Symbol.toPrimitive | |
|---|---|
| Writable | no |
| Enumerable | no |
| Configurable | no |
Mô tả
Với sự trợ giúp của thuộc tính Symbol.toPrimitive (được dùng như giá trị hàm), một đối tượng có thể được chuyển đổi thành giá trị nguyên thủy. Hàm được gọi với đối số chuỗi hint, chỉ định kiểu ưu tiên của giá trị nguyên thủy kết quả. Đối số hint có thể là một trong số "number", "string", và "default".
Gợi ý "number" được dùng bởi các thuật toán ép kiểu số. Gợi ý "string" được dùng bởi thuật toán ép kiểu chuỗi. Gợi ý "default" được dùng bởi thuật toán ép kiểu nguyên thủy. hint chỉ là tín hiệu yếu về sở thích, và việc triển khai có thể bỏ qua nó (như Symbol.prototype[Symbol.toPrimitive]() làm). Ngôn ngữ không bắt buộc sự căn chỉnh giữa hint và kiểu kết quả, mặc dù [Symbol.toPrimitive]() phải trả về một nguyên thủy, hoặc TypeError sẽ được ném.
Các đối tượng không có thuộc tính [Symbol.toPrimitive] được chuyển đổi thành nguyên thủy bằng cách gọi các phương thức valueOf() và toString() theo các thứ tự khác nhau, điều này được giải thích chi tiết hơn trong phần ép kiểu. [Symbol.toPrimitive]() cho phép kiểm soát hoàn toàn quá trình chuyển đổi nguyên thủy. Ví dụ, Date.prototype[Symbol.toPrimitive]() coi "default" như "string" và gọi toString() thay vì valueOf(). Symbol.prototype[Symbol.toPrimitive]() bỏ qua gợi ý và luôn trả về một symbol, nghĩa là ngay cả trong ngữ cảnh chuỗi, Symbol.prototype.toString() sẽ không được gọi, và các đối tượng Symbol phải luôn được chuyển đổi rõ ràng thành chuỗi thông qua String().
Ví dụ
>Sửa đổi giá trị nguyên thủy được chuyển đổi từ một đối tượng
Ví dụ sau mô tả cách thuộc tính Symbol.toPrimitive có thể sửa đổi giá trị nguyên thủy được chuyển đổi từ một đối tượng.
// Đối tượng không có thuộc tính Symbol.toPrimitive.
const obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// Đối tượng có thuộc tính Symbol.toPrimitive.
const obj2 = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 10;
}
if (hint === "string") {
return "hello";
}
return true;
},
};
console.log(+obj2); // 10 — hint là "number"
console.log(`${obj2}`); // "hello" — hint là "string"
console.log(obj2 + ""); // "true" — hint là "default"
Đặc tả
| Thông số kỹ thuật |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.toprimitive> |