Object.prototype.toString()

toString()Object 实例的方法,它返回一个表示该对象的字符串。此方法旨在被派生对象覆盖,以实现自定义的 类型强制 逻辑。

试一试

语法

js
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]() 方法,它允许您对转换过程进行更细粒度的控制,并且对于任何类型转换,它始终优先于 valueOftoString

要使用基本 Object.prototype.toString() 与覆盖了它的对象一起使用(或在 nullundefined 上调用它),您需要在其上调用 Function.prototype.call()Function.prototype.apply(),并将您想要检查的对象作为第一个参数传递(称为 thisArg)。

js
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。许多内置对象,包括 MapSymbol,都具有 Symbol.toStringTag。一些早于 ES6 的对象没有 Symbol.toStringTag,但仍然具有特殊的标签。它们包括(标签与下面给出的类型名称相同)

arguments 对象返回 "[object Arguments]"。其他所有内容,包括用户定义的类,除非具有自定义的 Symbol.toStringTag,否则将返回 "[object Object]"

nullundefined 上调用的 Object.prototype.toString() 分别返回 [object Null][object Undefined]

示例

覆盖自定义对象的 toString

您可以创建一个函数来代替默认的 toString() 方法。您创建的 toString() 函数应返回一个字符串值。如果它返回一个对象并且该方法在 类型转换 期间被隐式调用,则其结果将被忽略,并且使用相关方法 valueOf() 的值代替,或者如果这些方法都没有返回基本类型,则抛出 TypeError

以下代码定义了一个 Dog 类。

js
class Dog {
  constructor(name, breed, color, sex) {
    this.name = name;
    this.breed = breed;
    this.color = color;
    this.sex = sex;
  }
}

如果您在 Dog 的实例上显式或隐式调用 toString() 方法,它将返回从 Object 继承的默认值。

js
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");

theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"

以下代码覆盖了默认的 toString() 方法。此方法生成一个包含对象的 namebreedcolorsex 的字符串。

js
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() 方法。

js
const theDog = new Dog("Gabby", "Lab", "chocolate", "female");

`${theDog}`; // "Dog Gabby is a female chocolate Lab"

使用 toString() 检测对象类

toString() 可以与每个对象一起使用,并且(默认情况下)允许您获取其类。

js
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() 的行为,从而导致意外结果。例如

js
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 的浏览器中加载。

另请参阅