js类型转换

280 阅读2分钟

类型转换

JS 数据类型

js 有以下7种数据类型

  • number
  • string
  • boolean
  • object
  • undefined
  • null
  • symbol

类型转换主要是转换成 numberstringboolean 三种类型

转 number

  • string :'-0' -> -0,'+0' -> 0;其余数字字符串照常转 number ,非数字自粗穿转成 NaN
  • booleantrue -> 1,false -> 0
  • ojbect :依次取决于 object[Symbol.toPrimitive]()object.valueOf()object.toString()。如果都没有则报错。

object 转基础数据类型时,具体的值取决于三个内置函数:object[Symbol.toPrimitive]()(优先度最高),object.valueOf()object.toString() ,三个函数用户都可以自行重写,若转换时三个都不存在则报错。

  • undefinedNaN
  • null:0
  • symbol:报错
  • array:空数组 -> 0;数组只有一个元素且该元素可以转成数字,即转成对应数字;其余情况 NaN

arraynumber,其实本质上是跟 object 等引用类型转 number 是一样的,按优先程度依次调用 arr[Symbol.toPrimitive]()arr.valueOf()arr.toString()arr.join(),因为普通数组一般没有重写前三个方法,所以默认调用 join 先转成字符串,然后再由字符串转成数字,所以才会出现上述结果

转 boolean

  • number :除了 0,-0,NaNfalse,其余都为 true
  • string :除了空串,都为 true
  • object function array等引用类型:true
  • nullundefinedtrue
  • symboltrue

转 string

  • number:照常转
  • boolean:照常转
  • object:依次取决于 object[Symbol.toPrimitive]()object.toString()(不调用 valueOf)。如果都没有则报错。
  • null:'null'
  • undefined:'undefined'
  • symbol:'Symbol(Symbol.xxxxxx)'
  • array:调用 array.join()

转换场景

四则运算符

加法运算

  • 当其中一方是字符串时,另一方会自动转成字符串
'a' + 333 // a333
  • 当其中一方为非数字和非字符串,先将其转化为数字或字符串,再走上一步
true + true // 2 boolean 优先转数字
null + null // 0 null 优先转数字
undefined + undefined // NaN undefined 优先转数字

// -------------------------------------------------------------------------------------
// 当其中之一为引用类型,按优先程度依次调用 Symbol.toPrimitive valueOf toString
const a = {};
a[Symbol.toPrimitive] = () => 10;
a.valueOf = () => true;
a.toString = () => 'i am a';
1 + a // 11

const b = {};
b.valueOf = () => true;
b.toString = () => 'i am b';
1 + b // 2 先调用 valueOf 转换成 true, true 再转换成 1

const c = {};
c.toString = () => 'i am c';
1 + c // 1i am c

// -------------------------------------------------------------------------------------
// 当其中之一为数组,按优先程度依次调用 Symbol.toPrimitive valueOf toString join
const arr1 = [1, 2, 3];
arr1[Symbol.toPrimitive] = () => 10;
arr1.valueOf = () => true;
arr1.toString = () => 'i am arr1';
arr1.join = () => 'join';
1 + arr1 // 11

const arr2 = [1, 2, 3];
arr2.valueOf = () => true;
arr2.toString = () => 'i am arr2';
arr2.join = () => 'join';
1 + arr2 // 2

const arr3 = [1, 2, 3];
arr3.toString = () => 'i am arr3';
arr3.join = () => 'join';
1 + arr3 // 1i am arr3

const arr4 = [1, 2, 3];
arr4.join = () => 'join';
1 + arr4 // 1join
  • 注意 +(正号),-(负号)
1 + +'c' // NaN: +'c' 把 c 转换成数字了,即 NaN
1 + -true // 0: -true 把 true 先转换成数字了,即 -1

非加法四则运算

全部转成数字再计算

比较运算符

> >= < <=

  • a 为字符串,b 为字符串,比较编码
  • a 为数字,另一方为自动转换为数字
  • a 为字符串,b为非数字非字符串,先将 b 转换为基础类型
    • 若 b 为数字,把 a 也转成数字
    • 若 b 为字符串,比较字符串

==

这玩意儿太反人类了...不做详细介绍,自己感受 avatar