数据类型转换【string、number、boolean】
<1> ==> string
三种方法:toString() 和 String() 和 +操作符
- null 、undefined 没有 toString() 方法 ,如果没有就用 String()
- 用 + 操作符给一个值加上一个空字符串 "" ,就能得到该值的字符串形式
null + "" = "null"
2 + "" = "2"
<2> ==> number
三种方法:Number() 和 parseInt() 和 parseFloat() 【后两个只适用于string-->number】
Number()适用于任何数据类型- boolean: true ---> 1 , false ---> 0
- unll ---> 0
- undefined ---> NaN
- string
- 如果字符串中的字符只有数值/"+"/"-",就会返回该数值的十进制形式 Number("011") ---> 11 , Number("-123") ---> -123 - 如果字符串是有效的十六进制格式,就会返回该十六进制对应的十进制数字 Number("0xf123") ---> 61731 - 如果字符串为空字符串 "" ,则返回 0 Number("") ---> 0 - 如果字符串还包含其他字符,eg:"a" ,则返回 NaN Number("211a") ---> NaN- object
- 会先调用 valueOf() 方法【拆箱】,如果返回的是 number 类型的,直接返回; - 如果不是,则会再调用 toString() 转化为字符串,然后再调用**Number()**按照字符串的规则进行转换!!!
补: valueOf() 方法:
该方法返回对象的原始值,eg: 像 number、string、boolean 这些,有自己的原始值包装类型!!那么在它们身上调用 valueOf() 就会返回它们的原始值类型。如果对象没有原始值,就返回该对象本身!!当然可以重写该方法,返回自己想返回的值!!!
补: toString() 方法:
console.log({1:1}.toString())
console.log([1,2].toString())
console.log(new Date().toString())
-
parseInt(str , [ n ] )【 第一个不是空格or数字or(+/-) 直接 NaN 】-
从字符串的第一个非空格字符开始,如果第一个非空格字符不是数值/符号+/符号- , 直接返回 NaN
-
空字符串""也会返回NaN
parseInt("") // NaN -
会从第一个可转化的字符开始,一直到碰到非数值字符,就会停止转换!!
parseInt("1234BLUE") // 1234 -
只能识别整数部分
paseInt("22.5") // 22 -
可以识别不同的整数格式,给第二个参数传入,按照多少进制的格式即可
parseInt("AF" , 16) //175
-
-
parseFloat(str)string ----> number 【只能识别十进制的字符串】- 跟上述的 parseInt() 类似,只是只能识别十进制 ,且可以识别小数部分
parseInt("1234BLUE") // 1234
paseInt("22.5") // 22.5
总的来说: Number() 和 parseInt() 的区别:
- Number() 是只要包含非数值的且不是+ 、- 、" "的字符 的就会 ===> NaN
- parseInt()是只要开头有可以转化为数字的(从非空字符开始)就行,转化到非数值停止
- Number("") = 0 , Number(" ") = 0
- parseInt("") = NaN ,parseInt(" ") = NaN
<3> ==> boolean
假值的类型:
- undefined
- null
- 0 、NaN 、+0 、-0
- ""
注意:
- {} 转为布尔值为 true
- " " 为 true
隐式类型转换
JS 中的隐式类型转换一般发生在
+ - * /以及== > < !操作符之间。而这些操作符只能操作原始值类型,所以如果有对象,就会先调用 valueOf() 方法,如果返回的是原始值类型,就直接返回,如果不是,就接着调用 toString() 方法!!!
<1> + 加 操作符 【主 string】
<2>- * / 减乘除 操作符 【主 number】
<3>>= <= 比较操作符 【主 number】
- string > string 不用进行转换,直接按顺序一个一个字符比较 ASCII 码的值即可!!!
<4> != 和 == 操作符会进行类型转换 【主 number】
-
string == string 不用进行转换,直接按顺序一个一个字符比较 ASCII 码的值即可!!!
-
有 NaN ,就直接返回 false
<5> !== 和 === 不会进行类型转换
- 类型不一样就直接返回 false
var a = {};
a > 2 // false
// 其中涉及的隐式转换过程如下: 【> 操作符 主number 】
- 对于 {} ,先调用 {}.valuef() ,由于{}不存在与之对应的原始值类型(即没法拆箱),
所以就会返回该对象本身,即 {}
- 然后再调用 {}.toString() 方法,由于 {} 是 Object 的实例,所以此处的 toString() 方法,
就是Object原型上的toString()方法(没有经过重写的),所以就会返回字符串"[object Object]"
- 再把"[object Object]"转换为 number 类型为 NaN
- NaN > 2 // false