背景
在 JavaScript 中,每一个对象都有 toString 方法,它的作用是将一个对象转换成一个字符串。例如:
let obj = { name: "Alice", age: 18 }; console.log(obj.toString()); // "[object Object]"
在 ES5 中,toString 方法有一个缺陷,它返回的字符串只能告诉我们该对象是一个 Object 类型的对象,但是无法告诉我们更多的信息,例如对象的具体类型。这对于开发人员来说是一个麻烦,因为无法准确地知道一个对象的具体类型。然而,ES6 引入了一个新的机制,可以解决这个问题。
Symbol.toStringTag
ES6 引入了一种新的内置 Symbol 类型,叫做 Symbol.toStringTag。它可以让开发人员自定义对象的 toString 方法所返回的字符串。具体来说,一个对象可以通过在其原型链上定义一个 Symbol.toStringTag 属性来自定义其 toString 方法的返回值。这个属性的值应该是一个字符串,表示对象的具体类型。
例如,我们可以定义一个 Animal 类型的对象,它继承自 Object 类型,然后在它的原型链上定义一个 Symbol.toStringTag 属性,如下所示:
-- -------------------- ---- ------- ----- ------ - ----------------- - --------- - ----- - --- ---------------------- - ------ --------- - ---------- - ------ ---------- - -
上面的代码中,我们通过在 Animal 类的原型链上定义一个 Symbol.toStringTag 属性,将其 toString 方法返回的字符串定制为 "Animal"。
现在我们来使用这个 Animal 类型的对象:
let obj = new Animal("cat"); console.log(obj.toString()); // "cat" console.log(obj[Symbol.toStringTag]); // "Animal" console.log(Object.prototype.toString.call(obj)); // "[object Animal]"
从上面的代码可以看出,obj 的 toString 方法返回的是对象的名称,而不是默认的 "[object Object]",这使得开发人员更方便地知道对象的类型。
注意,Object.prototype.toString 方法会按照如下方式返回对象的类型:
Object.prototype.toString.call(obj); // "[object 类型]"
其中,"类型" 代表对象的具体类型。我们可以将 Symbol.toStringTag 属性的值设置为 "类型",以定制返回值。
使用场景
Symbol.toStringTag 主要用于以下场景:
- 当你需要知道一个对象的具体类型,并且你的代码需要以此作为判断依据。
- 当你需要以一个自定义格式输出一个对象的信息,在某些情况下可能会比 toJSON 方法更为方便。
总结
Symbol.toStringTag 是一个很有用的特性。它让我们能够自定义对象的 toString 方法所返回的字符串,从而更方便地知道一个对象的具体类型。当你需要知道一个对象的具体类型时,Symbol.toStringTag 可以帮助你快速地了解它。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64853a5c48841e9894420cf2