1. 对象类型转换时的分类
  2. 对象转换时的步骤
  3. Symbol.toprimitive
  4. toString和valueOf
  5. 必须返回一个基础类型
  6. 存在显示的toString方法
  7. 摘要
对象转换时先要确定转换的类型,这个类型在对象的[Symbol.toPrimitive]属性值-函数的参数中可以拿到,一共有三种:
  1. string
  2. number
  3. default

string
以下两种情况会将确定对象的转换类型为string:

  1. 使用alert(person)
  2. 将对象看做是一个对象的属性来取值时,例如family[person]

number
以下两种情况会将确定对象的转换类型为number:

  1. 使用一元数学操作符,例如alert(+person)
  2. 使用比较运算符,例如alert(person > 1)

default
其他情况会确定对象的转换类型为default:

  • 相加操作,例如alert(obj + 1)
  • 相等比较,例如alert(obj == 2)
对象转换时的步骤
  1. 先看对象内有没有[Symbol.toPrimitive]属性
  2. 如果有,则执行该方法
  3. 如果没有,则检查对象要转换的类型
  4. 如果是string,执行toString()valueOf()方法,如果其中一种存在的话
  5. 如果是number,执行valueOf()toString()方法,如果其中一种存在的话
  6. 如果是default,执行valueOf()toString()方法,如果其中一种存在的话

下面是几个例子

  • [Symbol.toPrimitive]属性:
  let obj = {
    name: 'jack',
    money: 1,
    [Symbol.toPrimitive](hint) {
      console.log(hint);

      return hint == 'string' ? this.name : this.money;
    },
  };
  let person = {
    jack: 'property jack',
  };

  // hint equals to string
  alert(obj);  // jack
  alert(person[obj]) // property jack

  // hint equals to number
  alert(+obj); // 1
  alert(obj > 0); // true

  // hint equals to default
  alert(obj + 50); // 51
  • 没有[Symbol.toPrimitive]属性
  let obj = {
    name: 'jack',
    money: 1,
  };

  // hint equals to string, excutes the toString() and return [object object]
  alert(obj); // [object object]
  // hint equals to number, excutes the valueOf() and return the object itself
  alert(+obj); // NaN  
  // hint equals to default, excutes the valueof() and return the object itself
  alert(obj === obj);  // true  // do the same as (obj.valueOf() === obj);
  
必须返回一个基础类型

无论是调用哪个函数,他都必须返回一个基本数据类型,如果返回的不是基本数据类型,在严格模式下会报错

存在显示的toString方法

存在显示声明的toString()方法,并且不存在其他类型转换方法,例如valueOf()或者[Symbol.toPrimitive],则无论对象是按照什么类型转换,都执行toString()方法。(存在显示的toString,则只找toString,不找valueOf)

 // if there exsits a toString(), and no other functions such as valueOf() or [symbol.toPromitive], then all the conversions will excute toString()
  let obj = {
    name: 'jack',
    money: 1,
    toString() {
      return  this.money;
    },
  };

  alert(obj); // 1
  alert(+obj); // 1 
  alert(obj + 9); // 10
摘要

先确定对象是按照什么类型转换,一共有三种类型:

  1. string
  2. number
  3. default

转换规则:

  1. 先看对象内有没有[Symbol.toPrimitive]属性
  2. 如果有,则执行该方法
  3. 如果没有,则检查对象要转换的类型
  4. 如果是string,执行toString()valueOf()方法,如果其中一种存在的话
  5. 如果是number,执行valueOf()toString()方法,如果其中一种存在的话
  6. 如果是default,执行valueOf()toString()方法,如果其中一种存在的话
参考:https://javascript.info/objec...

DongL
67 声望1 粉丝

I'm Looking for a job based in Shen zhen.