数据类型转换
一、把原始类型转为对象 Object(value) new Object(value)
二、把其他类型转为布尔
除了 0 NaN null undefined 空字符串转为false以为 其他都是转为true
三、把其他类型转为字符串
除对象以外 其他大部分用引号包起来即可(字符串拼接)bigInt会把n去掉
+左右两边有一边出现了字符串或者部分对象 都是按照字符串拼接
+只存在一边
let n = '1'
+n ----> 1 数字 ++n ------> 2(先进行+ 在进行运算) 数字 n++ --------> 2(先进行运算 在+) 数字
{}+10 ----> '10' 会将大括号看成代码块
10+{} ------>"10[object Object]" 会将{}转为字符串
let a = {} a+10 ------> "[object Object]10"
对象转字符串 先去调对象的Symbol.toPrimitive属性 如果没有这个属性 则会调对象的valueOf()方法获取原始值 如果不是原始值 再调用对象的toString()方法转为字符串
10+[10, 20] ------> [10, 20]没有Symnol.toPrimitive 则调用valueOf 转为 [10, 20] 不是原始值 则调用toString 转为‘10, 20’ 最终为‘1010, 20’
20 + new Number(20) -----> new Number 没有Symbol.toPrimitive 则调用valueOf 转为20 是number原始值 则20 + 20 为40
+new Date() --------> 1618839610608
[].valueOf()/{}.valueOf()都会报错 会把[]/{}认为是代码块 没有valueOf方法 但是 let a = []/{} a.valueOf()则正常
四、把其他类型转为数值
Number(value) 一般用于隐式转换 如数学运算 isNaN == 等。 字符串转为数值 空字符串转为0 字符串中只要出现非数字字符结果就是NaN Number('10p') --->NaN true ---> 1 false ----> 0 null ----> 0 undefined ---->NaN Synbol ----> 报错 bigInt ----> 正常转换 对象 经过 Symbol.toPrimitive ---> valueOf ---> toString ---> Number
Number([10]) ----> 10
Number({}) ----> NaN
Number([]) ----> 0
Number('') ----> 0
parseInt/parseFloat(value) 会先把value转为字符串 再从字符串左边开始找 找到第一个非数值的字符为止 如果都不是数值 则为NaN oarseFloat多识别一个小数点
parseInt('10pppp') ----> 10
parseInt('sdddd111') ---> NaN
parseInt(null) ----> NaN
parseInt([]) /parseInt('') /parseInt({}) ---> NaN
五、==双等于的隐式转换 两边的数据类型不一样 先回转为相同类型在进行比较
1、 对象 == 字符串 则对象先转为字符串
2、null == undefined ----> true 但是null/undefined与其他的任何数都不相等
3、NaN == NaN ----> false
4、Symbol() == Symbol() ---> false Symbol是唯一值
5、其余情况(对象 == 数字、 字符串==布尔....)都是转为数值再进行比较