Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

Object.prototype.toString()

BaselineWidely available

toString() 方法返回一个表示该对象的字符串。该方法旨在重写(自定义)派生类对象的类型转换的逻辑。

尝试一下

function Dog(name) {  this.name = name;}const dog1 = new Dog("Gabby");Dog.prototype.toString = function dogToString() {  return `${this.name}`;};console.log(dog1.toString());// Expected output: "Gabby"

语法

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-prototype 对象之外的对象)都继承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.toStringTagtoString.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]

规范

Specification
ECMAScript® 2026 Language Specification
# sec-object.prototype.tostring

浏览器兼容性

参见

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp