js基础——谈谈JS中类型转换机制

89 阅读4分钟

谈谈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转number1. praseInt('1234abcd123') // 1234; 忽略前置空格,解析数字字符直到遇到非数字字符(负数除外)
2. parseInt(' ') // NAN 空字符串转为NAN
3. parseInt(22.5) // 22 浮点数不认. 向下取整
4. parseInt('0x12')// 18 十六进制转换为十进制
5. 指定第二个参数转换进制 parseInt('777',8)// 字符串是八进制的,转为十进制数字
parseFloat()只适用于string1. 与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
booleanfalse
number0 NAN
string空字符串
undefinedundefined
objectnull

操作符和类型转换

我认为呢操作符本身是有操作值的类型要求的,而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==stringstring转为number
boolean==*boolean转为number
object==number | stringobject通过valueof()和toString() 转为string,再根据另一个比较数的类型决定是否转为number
null==undefined

除以上情况不同类型的比较均不相等