类型转换
JS 数据类型
js 有以下7种数据类型
- number
- string
- boolean
- object
- undefined
- null
- symbol
类型转换主要是转换成 number,string 和 boolean 三种类型
转 number
string:'-0' -> -0,'+0' -> 0;其余数字字符串照常转number,非数字自粗穿转成NaNboolean:true-> 1,false-> 0ojbect:依次取决于object[Symbol.toPrimitive](),object.valueOf(),object.toString()。如果都没有则报错。
当
object转基础数据类型时,具体的值取决于三个内置函数:object[Symbol.toPrimitive]()(优先度最高),object.valueOf(),object.toString(),三个函数用户都可以自行重写,若转换时三个都不存在则报错。
undefined:NaNnull:0symbol:报错array:空数组 -> 0;数组只有一个元素且该元素可以转成数字,即转成对应数字;其余情况NaN
array转number,其实本质上是跟object等引用类型转number是一样的,按优先程度依次调用arr[Symbol.toPrimitive](),arr.valueOf(),arr.toString(),arr.join(),因为普通数组一般没有重写前三个方法,所以默认调用join先转成字符串,然后再由字符串转成数字,所以才会出现上述结果
转 boolean
number:除了 0,-0,NaN为false,其余都为truestring:除了空串,都为trueobjectfunctionarray等引用类型:truenull,undefined:truesymbol:true
转 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 为字符串,比较字符串
==
这玩意儿太反人类了...不做详细介绍,自己感受
