谈谈JS中类型转换机制
其他转number
Number() 参考上面包装类型
- Number(true) //1 Number(false) //0
- Number(null) // 0
- Number(undefined) // NAN
三种方法比较字符串转数字 转换方法:Number() parseInt() parseFloat
| 方法 | 使用范围 | 字符串规则 |
|---|---|---|
Number() | 适用于所有类型转换 | 1.Number('-021.1')// -21.1字符串只包含数字(正数,负数,浮点数),忽略前导零返回十进制数 2. Number('0x12')// 18 如果字符串中包含有效的十六进制数转为十进制整数.忽略前导零表示不支持八进制 3. Number('') // 0 字符串为空,转为0 4.Number('123abc') // NAN 字符串中包含其他字符,转为NAN |
parseInt() | 只适用于string转number | 1. praseInt('1234abcd123') // 1234; 忽略前置空格,解析数字字符直到遇到非数字字符(负数除外) 2. parseInt(' ') // NAN 空字符串转为NAN 3. parseInt(22.5) // 22 浮点数不认 . 向下取整4. parseInt('0x12')// 18 十六进制转换为十进制 5. 指定第二个参数转换进制 parseInt('777',8)// 字符串是八进制的,转为十进制数字 |
| parseFloat() | 只适用于string | 1. 与parseInt()基本相同,但是认识第一个.,从第二个开始就不认识了 2.没有第二个参数 |
其他转string
调用toString() 方法,除了null和undefined都有这个方法 基础类型调用该方法: 会返回基础类型的字符串。
基础类型待用toString将值转为字符串
let n = 123
n.toString() // '123'
'123'.toString() // 字符串本身也有这个方法,相当于复制一个字符串
true.toString() // 'true' false同理
Symbol('123').toString() // 'Symbol(123)'
引用类型调用toString() 会打印什么
[].toString() // '' 空字符串
[[[[]]]].toString() // 空字符串
let fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.toString(); // 'Banana,Orange,Apple,Mango' 回把数组转成列表
let nums = ['1',['2','3']]
nums.toString() // '1,2,3' 拍扁嵌套,删除中括号
let o = {}
o.toString() // [object object]
let f = ()=>{}
f.toString() // '()=>{}'
如果是包装类型,会不会打印[object,object] 呢
let n = new Number(123)
n.toString() // '123' n.valueof() == 123
虽然包装类型是object 但是调用toString的时候不会打印['object','object']
那null和undefined怎么转换——通过 String() 转换
String(null) == 'null'
String(undefined) == 'undefined'
String() 的原理
// 等同于
MyString(v){
if(v===null){
return 'null'
}else if(v===undefined){
return 'undefined'
}else {
return v.toString()
}
}
其它转boolean
举出会转为false的情况,其它的情况就都是转为true了
转换方法: Boolean()
| 类型 | 转为false |
|---|---|
| boolean | false |
| number | 0 NAN |
| string | 空字符串 |
| undefined | undefined |
| object | null |
操作符和类型转换
我认为呢操作符本身是有操作值的类型要求的,而js的会让变量操作数尽可能的符合这个要求,才会出现操作数的隐式转换。从这个角度出发,来总结操作数的转换规则
+ - 操作符
+ 操作符使用的状况有两种
- 字符串+字符串
- 数字+数字
而且根据规则看起来字符串的优先级是要比数字高的 'abc'+NaN=='abcNaN'
总结起来 +操作符的规则
- 如果符合操作符的要求,那当然最好直接运算
- 如果有一个操作数是字符串,连另一个不是,则通过
String()转换操作数的类型 - 如果有一个操作数是数字,但是另一个既不是数字,也不是字符串,那就通过
Number()将类型转换- 在这种情况下 如果有NaN ,则计算结果都是NaN
- 使用的规则就只有
- 数字-数字
所以就是通过 Number() 将不同类型的转换成number类型
逻辑运算符! || &&
明显这些运算符都会转为 boolean
!!isTrue 可以用来代替 Boolean(isTrue)
|| 如果左侧条件为 true 后面就不会运行了
&& 如果左侧条件为false 右侧就不运行了,相当于一个条件限制
相等运算符
这个就没有什么运算规则了,如果是=== 就不用类型转化,但是如果是 == 会怎么转换呢。
关于 === 要注意的是 NaN===NaN false
小学老师告诉我们同类才能比较,那是谁换谁呢
[] == ![] // true
/*
* 首先,布尔操作符!优先级更高,所以被转变为:[] == false
* 其次,操作数存在布尔值false,将布尔值转为数字:[] == 0
* 再次,操作数[]是对象,转为原始类型(先调用valueOf(),得到的还是[],再调用toString(),得到空字符串''):'' == 0
* 最后,字符串和数字比较,转为数字:0 == 0
*/
NaN == NaN // false NaN不等于任何值
null == undefined // true
null == 0 // false
undefined == 0 // false
总结以下== 类型转换
| 类型 | 转换为 |
|---|---|
| number==string | string转为number |
| boolean==* | boolean转为number |
| object==number | string | object通过valueof()和toString() 转为string,再根据另一个比较数的类型决定是否转为number |
| null==undefined |
除以上情况不同类型的比较均不相等