Object.prototype.toString()
试一试
语法
toString()
参数
默认情况下,toString()
不接受任何参数。但是,继承自 Object
的对象可能会使用自己的实现覆盖它,这些实现确实接受参数。例如,Number.prototype.toString()
和 BigInt.prototype.toString()
方法接受一个可选的 radix
参数。
返回值
表示该对象的字符串。
描述
JavaScript 调用 toString
方法将 对象转换为原始值。您很少需要自己调用 toString
方法;当遇到需要原始值的上下文时,JavaScript 会自动调用它。
此方法优先于 字符串转换 中调用,但 数值转换 和 原始值转换 优先调用 valueOf()
。但是,由于基本 valueOf()
方法返回一个对象,因此通常最终会调用 toString()
方法,除非对象覆盖了 valueOf()
。例如,+[1]
返回 1
,因为其 toString()
方法返回 "1"
,然后将其转换为数字。
所有继承自 Object.prototype
的对象(即,除了 null
原型对象 之外的所有对象)都继承了 toString()
方法。当您创建自定义对象时,您可以覆盖 toString()
以调用自定义方法,以便您的自定义对象可以转换为字符串值。或者,您可以添加一个 [Symbol.toPrimitive]()
方法,它允许您对转换过程进行更细粒度的控制,并且对于任何类型转换,它始终优先于 valueOf
或 toString
。
要使用基本 Object.prototype.toString()
与覆盖了它的对象一起使用(或在 null
或 undefined
上调用它),您需要在其上调用 Function.prototype.call()
或 Function.prototype.apply()
,并将您想要检查的对象作为第一个参数传递(称为 thisArg
)。
const arr = [1, 2, 3];
arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString()
返回 "[object Type]"
,其中 Type
是对象类型。如果对象具有一个值为字符串的 Symbol.toStringTag
属性,则该值将用作 Type
。许多内置对象,包括 Map
和 Symbol
,都具有 Symbol.toStringTag
。一些早于 ES6 的对象没有 Symbol.toStringTag
,但仍然具有特殊的标签。它们包括(标签与下面给出的类型名称相同)
arguments
对象返回 "[object Arguments]"
。其他所有内容,包括用户定义的类,除非具有自定义的 Symbol.toStringTag
,否则将返回 "[object Object]"
。
在 null
和 undefined
上调用的 Object.prototype.toString()
分别返回 [object Null]
和 [object Undefined]
。
示例
覆盖自定义对象的 toString
您可以创建一个函数来代替默认的 toString()
方法。您创建的 toString()
函数应返回一个字符串值。如果它返回一个对象并且该方法在 类型转换 期间被隐式调用,则其结果将被忽略,并且使用相关方法 valueOf()
的值代替,或者如果这些方法都没有返回基本类型,则抛出 TypeError
。
以下代码定义了一个 Dog
类。
class Dog {
constructor(name, breed, color, sex) {
this.name = name;
this.breed = breed;
this.color = color;
this.sex = sex;
}
}
如果您在 Dog
的实例上显式或隐式调用 toString()
方法,它将返回从 Object
继承的默认值。
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"
以下代码覆盖了默认的 toString()
方法。此方法生成一个包含对象的 name
、breed
、color
和 sex
的字符串。
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}`;
}
}
在上述代码到位后,每当在字符串上下文中使用 Dog
的实例时,JavaScript 都会自动调用 toString()
方法。
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");
`${theDog}`; // "Dog Gabby is a female chocolate Lab"
使用 toString() 检测对象类
toString()
可以与每个对象一起使用,并且(默认情况下)允许您获取其类。
const toString = Object.prototype.toString;
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math has its Symbol.toStringTag
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
以这种方式使用 toString()
是不可靠的;对象可以通过定义 Symbol.toStringTag
属性来更改 Object.prototype.toString()
的行为,从而导致意外结果。例如
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]
规范
规范 |
---|
ECMAScript 语言规范 # sec-object.prototype.tostring |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。