JS: Object.prototype.toString

By Xah Lee. Date: . Last updated: .

Object.prototype.toString ()

Returns a string representation of the object in thisBinding.

〔►see JS: “this” Binding

Usually used like this:

Object.prototype.toString.call ( obj )

If obj is a object, and has a symbol key property Symbol.toStringTag, either own property or inherited, and its value is a string, let's say the value is tag, then the result is "[object tag]"

Else, the result is one of the following:

Often used to find out the “type of object”. For example, {} is a object object, but /abc/ is regexp object.

〔►see JS: Determine Type of Object

console.log (
Object.prototype.toString.call ( {} ) === "[object Object]"
); // true

console.log (
Object.prototype.toString.call ( [] ) === "[object Array]"
); // true

console.log (
Object.prototype.toString.call ( /./ ) === "[object RegExp]"
); // true

console.log (
Object.prototype.toString.call ( new Date() ) === "[object Date]"
); // true

console.log (
Object.prototype.toString.call ( function f() {} ) === "[object Function]"
); // true

console.log (
Object.prototype.toString.call ( x => 3 ) === "[object Function]"
); // true

console.log (
Object.prototype.toString.call ( 1 ) === "[object Number]"
); // true

console.log (
Object.prototype.toString.call ( "" ) === "[object String]"
); // true

console.log (
Object.prototype.toString.call ( true ) === "[object Boolean]"
); // true

console.log(
Object.prototype.toString.call ( new Set() ) === "[object Set]"); // true

console.log(
Object.prototype.toString.call ( new Map() ) === "[object Map]"); // true

Example of object that has property key Symbol.toStringTag and value is a string.

let uu = {};
uu[Symbol.toStringTag] = "xyz";
console.log( Object.prototype.toString.call ( uu ) === "[object xyz]"); // true

〔►see JS: Symbol Tutorial

〔►see JS: Symbol Object

History of Object.prototype.toString

JavaScript language spec does not technically have different type of objects as different data types distinguisable by the typeof operator. Array, RegExp, Date, JSON, etc instances are all just object type. 〔►see JS: Data Types

In ECMAScript spec 5.1 (2011), object has a internal slot denoted “[[Class]]”.

ECMAScript 5.1 §8#sec-8.6.2

Its value is a string, representing the classification of the object.

This [[Class]] is what we think of the “type of object”.

The function Object.prototype.toString() returns the value of internal slot [[class]], in this string form "[object [[Class]]]"

ECMAScript 5.1 §15#sec-15.2.4.2

The possible return values are:

But in ES2015, the internal slot “[[Class]]” is removed from the spec. (probably because to avoid confusion with new ES2015 class feature. 〔►see JS: Class Tutorial〕 )

However, the behavior of Object.prototype.toString() is kept for backward compatibility, but how it works has changed.

ECMAScript 2015 §Fundamental Objects#sec-object.prototype.tostring

Now, if the object has a symbol property key Symbol.toStringTag, then that is used as part of the return value. Else, it falls back to ES5 behavior as is.

ECMAScript 2015 added new kinds of objects, such as Set and Map. 〔►see JS: Set Object〕. 〔►see JS: Map Object〕 New object's prototypes typically have symbol properties Symbol.toStringTag. For example, for set object, the value is the string "Set".

The symbol property Symbol.toStringTag can be set by user.

ECMAScript 2015 added this note:

NOTE Historically, this function was occasionally used to access the String value of the [[Class]] internal slot that was used in previous editions of this specification as a nominal type tag for various built-in objects. The above definition of toString preserves compatibility for legacy code that uses toString as a test for those specific kinds of built-in objects. It does not provide a reliable type testing mechanism for other kinds of built-in or program defined objects. In addition, programs can use @@toStringTag in ways that will invalidate the reliability of such legacy type tests.

ECMAScript 2015 §Fundamental Objects#sec-object.prototype.tostring

Reference

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

String Topic

  1. JS: Default Charset/Encoding
  2. JS: String Code Unit vs Code Point
  3. JS: Unicode Character Escape Sequence
  4. JS: Allowed Characters in Identifier
  5. HTML: Allowed Characters in id Attribute
  6. HTML: Character Sets and Encoding
  7. HTML/XML Entity List

  1. JS: Template String
  2. JS: Convert String to Number
  3. JS: Encode URL, Escape String
  4. JS: Format Number
  5. JS: JSON Object

  1. JS: String Object
  2. JS: String.prototype
  3. JS: String Constructor

Object and Inheritance Topic

  1. JS: Object System Overview
  2. JS: What's Object?
  3. JS: Prototype and Inheritance
  4. JS: Create Object
  5. JS: Object Literal Expression
  6. JS: Find Object's Prototype
  7. JS: How to Create Object with Parent X?
  8. JS: Prevent Adding Property
  9. JS: Determine Type of Object
  10. JS: Primitive Value Object Wrapper
  11. JS: Clone, Deep Copy Object/Array
  12. JS: Test Equality of Objects

  1. JS: Object Object
  2. JS: Object.prototype
Like what you read? Buy JavaScript in Depth