Object.prototype.toString()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Phương thức toString() của các instance Object trả về một chuỗi đại diện cho đối tượng này. Phương thức này được thiết kế để các đối tượng dẫn xuất ghi đè với logic ép kiểu tùy chỉnh.
Try it
const map = new Map();
console.log(map.toString());
// Expected output: "[object Map]"
Cú pháp
toString()
Tham số
Theo mặc định toString() không nhận tham số. Tuy nhiên, các đối tượng kế thừa từ Object có thể ghi đè nó bằng các triển khai riêng có nhận tham số. Ví dụ, các phương thức Number.prototype.toString() và BigInt.prototype.toString() nhận tham số radix tùy chọn.
Giá trị trả về
Một chuỗi đại diện cho đối tượng.
Mô tả
JavaScript gọi phương thức toString để chuyển đổi đối tượng thành giá trị nguyên thủy. Bạn hiếm khi cần tự gọi phương thức toString; JavaScript tự động gọi nó khi gặp đối tượng ở nơi cần giá trị nguyên thủy.
Phương thức này được gọi ưu tiên bởi string conversion, nhưng numeric conversion và primitive conversion gọi valueOf() ưu tiên hơn. Tuy nhiên, vì phương thức valueOf() cơ sở trả về đối tượng, phương thức toString() thường được gọi cuối cùng, trừ khi đối tượng ghi đè valueOf(). Ví dụ, +[1] trả về 1, vì phương thức toString() của nó trả về "1", sau đó được chuyển đổi thành số.
Tất cả các đối tượng kế thừa từ Object.prototype (tức là tất cả trừ đối tượng có prototype null) đều kế thừa phương thức toString(). Khi bạn tạo đối tượng tùy chỉnh, bạn có thể ghi đè toString() để gọi phương thức tùy chỉnh, giúp đối tượng tùy chỉnh của bạn có thể chuyển đổi thành giá trị chuỗi. Ngoài ra, bạn có thể thêm phương thức [Symbol.toPrimitive](), cho phép kiểm soát nhiều hơn quá trình chuyển đổi, và sẽ luôn được ưu tiên hơn valueOf hoặc toString cho bất kỳ chuyển đổi kiểu nào.
Để sử dụng Object.prototype.toString() cơ sở với một đối tượng đã ghi đè nó (hoặc gọi nó trên null hoặc undefined), bạn cần gọi Function.prototype.call() hoặc Function.prototype.apply() trên nó, truyền đối tượng bạn muốn kiểm tra làm tham số đầu tiên (gọi là thisArg).
const arr = [1, 2, 3];
arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString() trả về "[object Type]", trong đó Type là kiểu của đối tượng. Nếu đối tượng có thuộc tính Symbol.toStringTag có giá trị là chuỗi, giá trị đó sẽ được dùng làm Type. Nhiều đối tượng dựng sẵn, bao gồm Map và Symbol, có Symbol.toStringTag. Một số đối tượng có trước ES6 không có Symbol.toStringTag, nhưng vẫn có tag đặc biệt. Chúng bao gồm (tag giống với tên kiểu được liệt kê dưới đây):
Đối tượng arguments trả về "[object Arguments]". Tất cả mọi thứ khác, bao gồm các class người dùng định nghĩa, trừ khi có Symbol.toStringTag tùy chỉnh, sẽ trả về "[object Object]".
Object.prototype.toString() được gọi trên null và undefined trả về [object Null] và [object Undefined], tương ứng.
Ví dụ
>Ghi đè toString cho đối tượng tùy chỉnh
Bạn có thể tạo một hàm để gọi thay cho phương thức toString() mặc định. Hàm toString() bạn tạo phải trả về giá trị chuỗi. Nếu nó trả về đối tượng và phương thức được gọi ngầm trong chuyển đổi kiểu, thì kết quả của nó bị bỏ qua và giá trị của phương thức liên quan, valueOf(), được dùng thay thế, hoặc TypeError được ném nếu không có phương thức nào trả về giá trị nguyên thủy.
Đoạn code sau định nghĩa class Dog.
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
}
Nếu bạn gọi phương thức toString(), tường minh hoặc ngầm định, trên một instance của Dog, nó trả về giá trị mặc định được kế thừa từ Object:
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"
Đoạn code sau ghi đè phương thức toString() mặc định. Phương thức này tạo ra chuỗi chứa name, breed, color và sex của đối tượng.
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
toString() {
return `Dog ${this.name} is a ${this.sex} ${this.color} ${this.breed}`;
}
}
Với đoạn code trên, bất cứ khi nào một instance của Dog được sử dụng trong ngữ cảnh chuỗi, JavaScript tự động gọi phương thức toString().
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
`${theDog}`; // "Dog Gabby is a female chocolate Lab"
Sử dụng toString() để phát hiện class của đối tượng
toString() có thể được dùng với mọi đối tượng và (theo mặc định) cho phép bạn lấy class của nó.
const toString = Object.prototype.toString;
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math có Symbol.toStringTag
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
Sử dụng toString() theo cách này không đáng tin cậy; các đối tượng có thể thay đổi hành vi của Object.prototype.toString() bằng cách định nghĩa thuộc tính Symbol.toStringTag, dẫn đến kết quả không mong đợi. Ví dụ:
const myDate = new Date();
Object.prototype.toString.call(myDate); // [object Date]
myDate[Symbol.toStringTag] = "myDate";
Object.prototype.toString.call(myDate); // [object myDate]
Date.prototype[Symbol.toStringTag] = "prototype polluted";
Object.prototype.toString.call(new Date()); // [object prototype polluted]
Đặc tả
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.tostring> |