# 数据类型转换

  • https://juejin.im/post/6844903694039777288

# Object.prototype.valueOf()

  • valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身
  • 数组的valueOf方法返回数组本身
  • 函数的valueOf方法返回函数本身
  • 字符串的valueOf方法返会引号中的值
let obj = {a: 1}
obj.valueOf() // {a: 1}
var arr = [1, 2, 3];
arr.valueOf() // [1, 2, 3]
let f = function(){ return 123}
f.valueOf() //ƒ (){return 123}
  • valueOf()方法返回包装对象实例对应的原始类型的值
new Number(123).valueOf()  // 123
new String('abc').valueOf() // "abc"
new Boolean(true).valueOf() // true

# Object.prototype.toString()

  • toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串
  • 数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法,分别返回各自的字符串形式
[1, 2, 3].toString() // "1,2,3"

'123'.toString() // "123"

(function () {
  return 123;
}).toString()
// "function () {
//   return 123;
// }"

(new Date()).toString()
// "Tue May 10 2016 09:11:31 GMT+0800 (CST)"
  • toString()方法返回包装对象实例对应的字符串形式
new Number(123).toString() // "123"
new String('abc').toString() // "abc"
new Boolean(true).toString() // "true"

# 强制类型转换

# Number()

  • Number(324) //324 , 数值:转换后还是原来的值
  • Number('324') // 324, 字符串:如果可以被解析为数值,则转换为相应的数值
  • Number('324abc') // NaN, 字符串:如果不可以被解析为数值,返回 NaN
  • Number('') // 0, 空字符串转为0
  • Number(true) // 1, 布尔值:true 转成 1,false 转成 0
  • Number(false) // 0
  • Number(undefined) // NaN, undefined:转成 NaN
  • Number(null) // 0, null:转成0
  • Number({a: 1}) // NaN, 对象时,将返回NaN
  • Number({}) //NaN
  • Number(function(){return 123}) //NaN
  • Number([1,2]) //NaN
  • Number([]) //0, Number([1]) //1

# String()

  • String(123) // "123", 数值:转为相应的字符串。
  • String('abc') // "abc", 字符串:转换后还是原来的值。
  • String(true) // "true", 布尔值:true转为字符串"true",
  • String(false) // "false", false转为字符串"false"。
  • String(undefined) // "undefined",undefined:转为字符串"undefined"。
  • String(null) // "null", null:转为字符串"null"
  • String({a: 1}) // "[object Object]", 对象:返回一个类型字符串
  • String([1, 2, 3]) // "1,2,3", 数组:返回该数组的字符串形式
  • String([]) //""
  • String({}) //"[object Object]"
  • String(function(){return 123}) //function(){return 123}

# Boolean()

  • 除了以下五个值的转换结果为false,其他的值全部为true
  • undefined, null, 0(包含-0和+0, NaN, ''(空字符串)
  • true和false这两个布尔值不会发生变化
  • Boolean(true) // true
  • Boolean(false) // false
  • 所有对象(包括空对象,空数组,函数)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true

# 自动转换

  • 自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值
  • 预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值
  • 字符串的自动转换,主要发生在字符串的加法运算时
  • 除了加法运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
  • 一元运算符也会把运算子转成数值

#

  1. 当使用 + 运算符计算 string 和其他类型相加时,都会转换为 string 类型;其他情况,都会转换为 number 类型,但是 undefined 和 null 会转换为 NaN,相加结果也是 NaN。
  2. 当使用 + 运算符计算时,如果存在复杂类型,那么复杂类型将会转换为基本类型,再进行运算
  3. “对象类型转基本类型”这个过程。具体规则:
  • 对象在转换基本类型时,会调用该对象上 valueOf 或 toString 这两个方法,该方法的返回值是转换为基本类型的结果
  • 主观上说,这个对象倾向于转换成什么,就会优先调用哪个方法。如果倾向于转换为 Number 类型,就优先调用 valueOf;如果倾向于转换为 String 类型,就只调用 toString。这里我建议大家了解一些常用的转换结果,对于其他特例情况会查找规范即可。
  1. 全面总结一下:
  2. 对于加法操作,如果加号两边都是 Number 类型,其规则为:
  • 如果 + 号两边存在 NaN,则结果为 NaN(typeof NaN 是 'number)
  • 如果是 Infinity + Infinity,结果是 Infinity
  • 如果是 -Infinity + (-Infinity),结果是 -Infinity
  • 如果是 Infinity + (-Infinity),结果是 NaN
  1. 如果加号两边有至少一个是字符串,其规则为:
  • 如果 + 号两边都是字符串,则执行字符串拼接
  • 如果 + 号两边只有一个值是字符串,则将另外的值转换为字符串,再执行字符串拼接
  • 如果 + 号两边有一个是对象,则调用 valueof() 或者 toStrinig() 方法取得值,转换为基本类型再进行字符串拼接。
  1. 当然也可以进行显式转换,我们往往使用类似 Number、Boolean、String、parseInt 等方法,进行显式类型转换,这里不再展开