js中任何引用类型转为bool,都为true。只有 0, -0,NaN, "", null, undefined 六种转为bool时为false
三种隐式转换
- 将值转为原始值, ToPrimitive()
- 将值转为数字, ToNumber()
- 将值转为字符串, ToString()
ToPrimitive 转为原始值
Number & String
- 如果输入的值已经是一个原始值, 则直接返回它。
- 如果是一个对象,则调用对象的valueOf()方法。如果valueOf()返回值是一个原始值,则直接返回
- 如果valueof(), 返回的不是原始值, 继续调用toString(), 方法,如果toString()的返回值是一个原始值,直接返回
- 抛出TypeError 异常
总结就是引用类型向原始类型转变, 先是valueof后toString的模式期望得到一个原始类型,如果没法得到,就TypeError
// 通过原始值转换后会变成相对于的原始值let num = new Number('123');num.valueOf(); // 123let str = new String('12df');str.valueOf(); // '12df'let bool = new Boolean('fd');bool.valueOf(); // true// 特殊对象, valueof返回日期的毫秒形式let a = new Date();a.valueOf(); // 1515143895500// 剩下的返回的都是this,对象本身var a = new Array();a.valueOf() === a; // truevar b = new Object({});b.valueOf() === b; // true// 二次封装的toString(), 方法var num = new Number('123sd');num.toString(); // 'NaN'var str = new String('12df');str.toString(); // '12df'var bool = new Boolean('fd');bool.toString(); // 'true'var arr = new Array(1,2);arr.toString(); // '1,2'var d = new Date();d.toString(); // "Wed Oct 11 2017 08:00:00 GMT+0800 (中国标准时间)"var func = function () {}func.toString(); // "function () {}"// 原生的会返回对象的类型var obj = new Object({});obj.toString(); // "[object Object]"Math.toString(); // "[object Math]"
toNumber 转为数字
| undefined | NaN |
|---|---|
| null | +0 |
| bool | true = 1 ; false = 0 |
| 数字 | 数字 |
| 字符串 | 有字符串解析为数字,’asdf’ 为NaN |
| 对象 | 进行ToPrimitive转换得到原始值, 在进行ToNumber转为数字 |
ToString 将值转换为字符串
| undefined | “undefined” |
|---|---|
| null | “null” |
| bool | “false” || ‘true” |
| number | 11212 == “11212” |
| 对象object | 先进行Toprimitive转换得到原始值,在toString,转换为字符串 |
| 原始值 | 转换为数字 | 转换为字符串 | 转换为布尔值 |
|---|---|---|---|
| false | 0 | “false” | false |
| true | 1 | “true” | true |
| 0 | 0 | “0” | false |
| 1 | 1 | “1” | true |
| “0” | 0 | “0” | true |
| “000” | 0 | “000” | true |
| “1” | 1 | “1” | true |
| NaN | NaN | “NaN” | false |
| Infinity | Infinity | “Infinity” | true |
| -Infinity | -Infinity | “-Infinity” | true |
| “” | 0 | “” | false |
| “20” | 20 | “20” | true |
| “Runoob” | NaN | “Runoob” | true |
| [ ] | 0 | “” | true |
| [20] | 20 | “20” | true |
| [10,20] | NaN | “10,20” | true |
| [“Runoob”] | NaN | “Runoob” | true |
| [“Runoob”,”Google”] | NaN | “Runoob,Google” | true |
| function(){} | NaN | “function(){}” | true |
| { } | NaN | “[object Object]” | true |
| null | 0 | “null” | false |
| undefined | NaN | “undefined” | false |
在对非number类型运用数学运算符时,会先转换为number类型
- true == 0
- null == 1
* undefined = NaN
* ['5'] = 10
string
- 当一侧为String,被识别为字符串拼接,并会优先将另一侧转换为字符串
- 当一侧为Number,另一侧为原始类型,则将原始类型转换为Number类型。
- 当一侧为Number类型,另一测为引用类型,将引用类型和Number类型转换为字符串后拼接 ```javascript // 一个栗子 {} + ‘11’ = 11; [] + ‘11’ = ‘11’; [0] + “11” = ‘011’
123 + ‘123’ = ‘123123’ 123 + null = 123 123 + true = 123 123 + {} = “123[object Object]” 123 + [] = ‘123’ ```
转为boolean
如果只有单个变量,会先将变量转换为bool
只有 null undefined "" NaN 0 false 这几个是false,其他情况都是true
Number()
- true = 1; false = 0.
- null = 0, undefined = NaN.
- symbol 抛出异常
- string 如果只包含数字,则将其转换为十进制,如果包含有效的浮点数,将其转为浮点值,如果空串转为0,否则全是NaN
对象,如果部署了[Symbol.toPrimittive] 就调用此方法,否则调用对象valueOf() 方法
==
如果类型相同,无须转换。
- null == undefined -> true; 另外一个值必须时undefined和null,否则全部是false
- 如果是一个Symbol值直接返回false。
- string 和number 比较, 先将string转换为number类型
- boolean和其他任何类型比较时,那么转换为number。true = 1,false = 0。
- 原始类型和引用类型做比较时, 引用类型会依照ToPrimitive规则转为原始值,
- NaN 和其他任何类型比较永远返回false,包括自身
