参考:
[1] https://www.cnblogs.com/codelovers/p/5345484.html
[2] http://javascript.ruanyifeng.com/grammar/conversion.html
一, 类型转换
1. 强制转换
- Number()
- // 数值: 转换后还是原来的值
- Number(324) // 324
- // 字符串: 如果可以被解析为数值, 则转换为相应的数值, 否则 NaN
- Number('324') // 324
- Number(324a") // NaN
- // 空字符串: 转为 0
- Number('')
- // 布尔值: true 转成 1,false 转成 0
- Number(true)
- Number(false)
- // undefined: 转成 NaN
- Number(undefined) // NaN
- // null: 转成 0
- Number(null) // NaN
- // 普通对象: 转为 NaN
- Number({a: 1}) // NaN
- // 多个元素的数组: 转为 NaN
- Number([1, 2, 3]) // NaN
- // 单个元素的数组: 转为第一个元素
- Number([5]) // 5
注意 Number()与 parseInt()的区别:
Number()函数只要有一个字符无法转成数值, 整个字符串就会被转为 NaN, 而 parseInt()函数是逐个解析字符, 直到遇到无法解释的字符.
对象 (包括数组) 转换规则:
先计算
Number(obj.valueOf())
,obj.valueOf()返回的不是对象, 则返回计算结果, 否则计算
Number(obj.toString())
, 如果 obj.toString())返回的不是对象, 则返回计算结果, 否则抛出异常.
- String()
- // 数值: 转为相应的字符串.
- String(123) // "123"
- // 字符串: 转换后还是原来的值.
- String('abc') // "abc"
- // 布尔值: true 转为字符串 "true",false 转为字符串 "false".
- String(true) // "true"
- // undefined: 转为字符串 "undefined".
- String(undefined) // "undefined"
- // null: 转为字符串 "null".
- String(null) // "null"
- // 对象: 与 Number 方法的转换规则基本相同, 只是互换了 valueOf 方法和 toString 方法的执行顺序
- String({a: 1}) // "[object Object]"
- // 数组: 转为元素的字符串形式, 逗号分隔
- String([1, 2, 3]) // "1,2,3"
- Boolean()
除了以下五个值, 其他的全部返回 true
undefined
null
-0 或 + 0
- NaN
- '' //(空字符串)
注意: 所有对象都会转为 true, 包括下面这个:
Boolean(new Boolean(false)) // true
2. 自动转换
在不同数据类型之间进行一些运算, 或者对某些特定类型的变量使用一些操作符的时候, 会进行隐式类型转换, 目标表达式的期望值是什么, 变量就会被转换为对应类型的值, 转换规则跟上述强制转换是一样的
if 语句或者条件表达式中的非布尔型变量: 转化为布尔值
if(`abc`) 等价于 if(true)
if(`abc` && {}) 等价于 if(true && true)
return "abc" && null; 等价于 return true && false;
字符串与非字符串类型进行加法运算: 后者转化为字符串
- '5' + 1 // '51'
- '5' + true // "5true"
- '5' + false // "5false"
- '5' + {} // "5[object Object]"
- '5' + [] // "5"
- '5' + function (){} // "5function (){}"
- '5' + undefined // "5undefined"
- '5' + null // "5null"
对非数值变量使用处加法以外的运算符: 转化为数值
- '5' - '2' // 3
- '5' * '2' // 10
- true - 1 // 0
- false - 1 // -1
- '1' - 1 // 0
- '5' * [] // 0
- false / '5' // 0
- 'abc' - 1 // NaN
- null + 1 // 1
- undefined + 1 // NaN
对非数值变量使用一元运算符: 转化为数值
- +'abc' // NaN
- -'abc' // NaN
- +true // 1
- -false // 0
- *'abc' // error
- /'abc' // error
二, 非全等比较
有关 null, undefined,NaN
undefined 除了和 undefined 以及 null 进行非全等比较返回 true, 其它均返回 false
null 除了和 null 以及 undefined 进行非全等比较返回 true, 其它均返回 false.
NaN 和任何值比较(包括自身均返回 false
- null == null; // true
- null === null; // true
- undefined == undefined; // true
- undefined === undefined; // true
- NaN == NaN; // false
- NaN === NaN; // false
- null == undefined; // true
- null === undefined; // false
- undefined == null; // true
- undefined === null; // false
数字和字符串, 布尔类型, 数组进行比较时, 后者先转换为数字, 再进行比较
- 123 == '123asd'; //false
- 123 == '123'; //true
- 123 == false; //false
- 123 == true; //false
字符串和布尔类型比较: 两者都转化为 Number 再比较
- "qwe" == false; //false
- "qwe" == true; //false
- ""== false; // true"" == true; //false
数组和布尔值比较: 两者都转化为 Number 再比较
[] == false; //true
[0] == false; //true
[00] == false; // true
[0,0] == false ; //false
数组或对象和字符串进行比较: 前者转换成字符串再进行比较
- [] == ""; // true
- [0] == ""; // false
- [0] == "0"; // true
- var obj = {a: 1};
- obj == ""; // false
- obj == "[object Object]"; // true
来源: http://www.jianshu.com/p/fcb56e29c2cf