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(); // 123
let 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; // true
var 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,包括自身