字符串 (String)
数字转字符串:toString
布尔转字符串:toString
null转字符串:会报错
undefined转字符串:会报错
object转字符串:可以,但是得到的不是原内容
var a=1
a.toString() //'1'
var b=true
b.toString() //'true'
var c=null
c.toString //(报错)cannot read property 'toString' of null at<anong mous>:1:3
var d=undefined
d.toString //(报错)
var e={name:'wudi'};
e.toString() //"[object Object]"
复制代码
老司机的写法是把内容后面跟(+ ‘’)就能转成字符串了。
1 + '' // "1"
true + '' // "true"
null + '' // "null"
undefined + '' //"undefined"
var a = {}
a + '' //[object Object]
复制代码
还有个window.String() ,这个跟(+ ‘’)是一样的效果。
布尔(boolean)
布尔只要记住5个falsy值就行了
它的转换规则相对简单:除了以下五个值的转换结果为false,其他的值全部为true。
Boolean(o) //false(-0或者+0都是一样的)
Boolean(NaN) //false
Boolean('') //false(空字符串)
Boolean(undefined) //false
Boolean(null) //false
复制代码
注意,所有对象(包括空对象)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true
Boolean([]) //true
Boolean({}) //true
Boolean(new Boolean(false)) //true
复制代码
只要记住,所有的对象的布尔值都是true就行了
老司机的写法是内容前面加上2个感叹号就行了
!! o //false
!! 1 //true
复制代码
数字(Number)
转换成数字有三种比较常见的方法:
-
Number()
-
parseInt()
-
parseFloat()
Number(123) //123 //数值转数值还是数值 Number('132') //123 //字符串如果可以被解析成数字,那就转成相应的数值 Number('123abc') //NaN //字符串不能全部解析,那就只能NaN Number('') //0 //空字符串转成零 Number(true) //1 Number(false) //0 //布尔值中true转成1,false转成0 Number(undefined) //NaN // undefined:转成 NaN Number(null) //0 // null:转成0 复制代码
Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
但是parseInt就没有这么严格了
parseInt("123abc") //123
Number("123abc") //NaN
parseInt("0123") //123
parseInt("011",8) //9 (字符串后面的8是八进制的意思,默认十进制)
复制代码
上面代码中,parseInt逐个解析字符,而Number函数整体转换字符串的类型。
另外,parseInt和Number函数都会自动过滤一个字符串前导和后缀的空格。
parseInt('\t\v\r12.34\n') // 12
Number('\t\v\r12.34\n') // 12.34
复制代码
当Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
复制代码
老司机一般用减零法或者是取正法来完成这个操作
需要的内容减零(- 0)
需要的内容取正 (+ )
'1' - 0 //1 (这个比较常用)
+ '1' //1 (这个容易混淆,不常用)
复制代码
自动转换
下面介绍自动转换,它是以强制转换为基础的。
遇到以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。
第一种情况,不同类型的数据互相运算。
123 + 'abc' // "123abc"
复制代码
第二种情况,对非布尔值类型的数据求布尔值。
if ('abc') {
console.log('hello')
} // "hello"
复制代码
第三种情况,对非数值类型的值使用一元运算符(即+和-)。
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
复制代码
自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值。
由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串的地方,全部使用Boolean、Number和String函数进行显式转换。