把其他类型转换为数字类型
发生的情况:
1)isNaN检测的时候:
当检测的值不是数字类型,浏览器会自己调用Number方法先把它转换为数字,然后再检测是否为非有效数字,例:
isNaN('3')=>false
①Number('3') -> 3
②isNaN(3) -> false
isNaN('3px')=>true
①Number('3px') -> NaN
②isNaN(NaN) -> true
2)基于parseInt/parseFloat/Number手动转化为数字类型
3)数学运算 + , - , * , / , %
4)在基于 == 比较的时候,有时候也会把其他值转换为数字类型
转换规律
把字符串转数字
只要遇到一个非有效数字字符,结果就是NaN
'' => 0,
' ' => 0,
'\n' => 0,
'\t' => 0,
'1' => 1,
'1a' => Nan
把布尔转换为数字
0 => false
1 => true
把null、undefined转换为数字
null => 0
undefined => NaN
把引用类型转换为数字
首先转换为字符串(toString)然后再转换为数字(Number)
把其他类型转换为字符串
发生的情况
1)基于alert/confirm/prompt/document.write等方法输出内容的时候,会把输出的值转换为字符串,然后再输出
alert(1) => '1'
2)基于 '+' 进行字符串拼接的时候
"hello" + true => "hellotrue"
3)把引用值转换为数字的时候,首先会转换为字符串,然后再转换为数字
var obj = {};
console.log(obj + 1) => "[object Object]1"
4)给对象设置属性,如果属性名不是字符串,首先转换为字符串,然后再当作属性存储到对象中
5)手动调用toString/toFixed/join/String等方法的时候
var n = Math.PI
n.toFixed(2) =>'3.14'
var arr = [1,2,3]
arr.join('+')=>'1+2+3'
转换规律
除了对象,其他数据类型都是常规转换 无论对象是什么样,toString的结果都是**[object Object]**
把其他值转换为布尔类型
发生的情况
基于! / !! / Boolean等方法的转换
条件判断中的条件最终都会转换为布尔类型
转换规律
Boolean(''); => false
Boolean(0); => false
Boolean(null); => false
Boolean(undefined); => false
Boolean(NaN); => false
其余全部都为true
特殊情况:数学运算和字符串拼接'+'
1、当表达式中出现字符串,就是字符串拼接,否则就是数学运算
1 + true => 2
'1' + true => '1true'
2、引用类型转换为数字,首先会转换为字符串,最后变成字符串拼接
[12] + 10 => '1210'
({}) + 10 => "[object Object]10"
3、{}块级作用域 接 数学预算
{} + 10 => 10
[] + 10 => '10'
"=="比较
"=="在进行比较的时候,如果左右两边的数据类型不一样,则先转换为相同的数据类型,再进行比较
"对象==对象"
地址空间相等则范围true
"对象==数字"
把对象转换为数字,然后再进行比较
"对象==布尔"
把对象和布尔都转换为数字,再进行比较
"对象==字符串"
把对象和字符串都转换为数字
"字符串==数字"
字符串转换为数字
"字符串==bool"
都转换为数字
"bool==数字"
bool转换为数字
null==undefined =>true
null===undefined=>false
null、undefined和其他值都不相等
NaN==NaN =>false
[] == false : true
![] == false: true
[] == true : false
![] == true : false