场景
isNaN('3') //false
Number('3') //3
isNaN(3) //false
isNaN('3px') //true
Number('3px') //NaN
isNaN(NaN) //true
'3' - 1 //2
Number('3') //3
3 - 1 //2
'3px' - 1 //NaN
'3px' + 1 //'3px1'
var i = '3';
i = i + 1; //'31'
i += 1; //'31'
i++ //4 单纯的数学运算, 没有字符串拼接
//浏览器在自行转换时都是基于Number()方法完成的
只要遇到一个非有效数字字符, 结果就是NaN
'' → 0
' ' → 0 空格 space
'\n' → 0 换行符 enter
'\t' → 制表符 tab
true → 1
false → 0
null → 0
undefined → NaN
//首先转换为字符串(toString), 然后再转换为数字(Number)
场景
alert/confirm/prompt/document.write
等方法输出内容的时候, 会把输出的值转换为字符串, 然后再输出alert(1) //'1'
toString/toFixed/join/String
等方法的时候, 也是为了转换为字符串var n = Math.PI; //获取圆周率
n.toFixed(2); //"3.14"
var arr = [12, 23, 34];
arr.join('+'); //'12+23+34'
转换规律
//调用`toString`方法进行转换
//对象以外
1 → '1'
NaN → 'NaN'
null → 'null'
[] → ''
[13] → '13'
[12, 23] → "12, 23"
...
//对象
'[object object]'
场景
转换规律
只有0/NaN/''/null/undefined
五个值转换为布尔的false, 其余都是转换为true
![] == false //true []为true ![]为false
+
//当表达式中出现字符串, 就是字符串拼接, 否则就是数学运算
1 + true //2
'1' + true //'1true'
[12] + 10 //"1210" 引用类型转换为数字, 首先会转换为字符串, 所以这里变成了字符串拼接
({}) + 10 //"[object Object]10"
[] + 10 //"10"
{} + 10 //10 这里既不是数学运算也不是字符串拼接, {} 代表一个代码块(块级作用域), 最终被执行的是 +10
严格写法为: {}; +10;
1 + undefined //NaN 这里为数学运算, Number(undefined) 为 NaN
1 + null //1
1 + false //1
==
在进行比较的时候, 如果左右两边的数据类型不一样, 则先转换为相同的类型, 再进行比较对象 == 对象 //比较的是地址
{name: 'xxx'} == {name: 'xxx'} //false
[] == [] //false
var obj1 = {};
var obj2 = obj1;
obj1 == obj2 //true
对象 == 数字: 对象转换为数字后再比较
对象 == 布尔: 都转换为数字 [] == false //0 == 0 true
对象 == 字符串: 都转换为数字
字符串 == 数字: 字符串转换为数字
字符串 == 布尔: 都转换为数字
布尔 == 数字: 布尔转换为数字 2 == true //false
//都是把其它值转换为数字后再进行比较
null == undefined: true
null != undefined和自己以外的其它值
undefined != null和自己以外的其它值
NaN == NaN: false //NaN和包括自己之内的所有值都不相等