强制类型转换
Number()
;String()
;Boolean()
Number()
举一些需要记的:
// 字符串:如果不可以被解析为数值,返回 NaN
Number(‘324abc’) // NaN
// 空字符串转为0
Number(‘’) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
parseInt和Number
- 不同之处:
parseInt
逐个解析字符
Number
函数整体转换字符串的类型
parseInt(’42 cats’) // 42
Number(’42 cats’) // NaN
- 相同之处:
都会过滤字符串前后空格
Number
方法的参数是对象时,将返回NaN
,除非是包含单个数值的数组:
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
先调用valueOf
,然后调用toString
。
如果想让对象做参数时不返回NaN
,要怎么做?
- 重写
valueOf
方法,让其返回原始类型值; - 重写
toString
,让其返回原始类型值; - 如果都改了的话,前者优先于后者。
String()
String
方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式:
String({a: 1}) // “[object Object]”
String([1, 2, 3]) // “1,2,3”
先调用toString
,然后调用valueOf
。
重定义两个方法会有什么效果?
String({
toString: function () {
return 3;
}
})
// “3”
String({
valueOf: function () {
return 2;
}
})
// “[object Object]”
String({
valueOf: function () {
return 2;
},
toString: function () {
return 3;
}
})
// “3”
Boolean()
对象的布尔值都为true
。
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean(‘’) // false
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true
将表达式变成布尔值
// 写法一
expression ? true : false
// 写法二
!! expression
一元运算符会把运算子转成数值:
+’abc’ // NaN
-‘abc’ // NaN
+true // 1
-false // 0