JavaScript Object to Primitive Conversion

Subscribe to my newsletter and never miss my upcoming articles

Listen to this article

image.png


Type coercion - Objects to Primitives

Type coercion can also occur on objects when certain operations are done on them.

See the example below:

const obj1 = { name: 'Peace', age: 18 };
const obj2 = { name: 'Bob', age: 10 };

const obj = obj1 + obj2;
// const obj = obj1 - obj2 // NaN number
console.log(obj, typeof obj)
// [object Object][object Object] string

See another example below:

const date1 = new Date(2050, 04, 03);
const date2 = new Date(2040, 11, 06);

const delta = date1 - date2;
console.log(delta, typeof delta); // 296784000000 number
date1 > date2 // true

In the examples above, the object type is converted to the different data types.


Type conversion - Objects to Primitives

Apart from objects auto-conversion to primitive, conversion can be specified ourselves.

const date1 = new Date(2050, 04, 03);
const date2 = new Date(2040, 11, 06);

const delta = date1 - date2;
// delta.valueOf() // 296784000000 => number
console.log(delta.toString, typeof delta); 
// [Function: toString] number

Symbol.toPrimitive

The built-in symbol named Symbol.toPrimitive can specify the conversion on an object.

obj[Symbol.toPrimitive] = function(hint) {
  // must return a primitive value
};

See the example below:

const user = {
  name: "Bello",
  money: 4000,

  [Symbol.toPrimitive](hint) {
    console.log(`hint: ${hint}`);
    return hint == "string" ? `{name: "${this.name}"}` : this.money;
  }
};

// conversions
console.log(user); 
/*
{
  name: 'Bello',
  money: 4000,
  [Symbol(Symbol.toPrimitive)]: [Function: [Symbol.toPrimitive]]
}
*/

console.log(+user); 
/*
hint: number
4000
*/

console.log(user + 500); 
/*
hint: number
4500
*/

In the example above, the method user[Symbol.toPrimitive] handles all the conversion.


Whogohost.png


toString and valueOf methods

Instead of the Symbol.toPrimitive method to handle all conversions, we can use the toString() and valueOf() methods.

A little adjustment is made to the example above.

See the example below:

const user = {
  name: "Bello",
  money: 4000,

  toString() {
    return `{name: "${this.name}"}`;
  },

  valueOf() {
    return this.money;
  }
};

// conversions
console.log(user); 
/*
{
  name: 'Bello',
  money: 4000,
  toString: [Function: toString],
  valueOf: [Function: valueOf]
}
*/

console.log(+user); // 4000
console.log(user + 500); // 4500

Below is another example:

const obj = {
  // toString handles all conversions in the absence of other methods
  toString() {
    return "10"; // string
  }
};

const toNum = obj * 4;
console.log(toNum, typeof toNum); // 44 number 
// * converted 10 in string to 44 in number

See another example below:

const obj = {
  // toString handles all conversions in the absence of other methods
  toString() {
    return "10";
  }
};

const str = obj + 4;
console.log(str, typeof str); // 104 string 
// + concatenate 10 and 4 to give a string

Buy me a Coffee


image

No Comments Yet