js中任何引用类型转为bool,都为true。只有 0, -0,NaN, "", null, undefined 六种转为bool时为false

三种隐式转换

  1. 将值转为原始值, ToPrimitive()
  2. 将值转为数字, ToNumber()
  3. 将值转为字符串, ToString()

ToPrimitive 转为原始值

Number & String

  1. 如果输入的值已经是一个原始值, 则直接返回它。
  2. 如果是一个对象,则调用对象的valueOf()方法。如果valueOf()返回值是一个原始值,则直接返回
  3. 如果valueof(), 返回的不是原始值, 继续调用toString(), 方法,如果toString()的返回值是一个原始值,直接返回
  4. 抛出TypeError 异常

    总结就是引用类型向原始类型转变, 先是valueof后toString的模式期望得到一个原始类型,如果没法得到,就TypeError

  1. // 通过原始值转换后会变成相对于的原始值
  2. let num = new Number('123');
  3. num.valueOf(); // 123
  4. let str = new String('12df');
  5. str.valueOf(); // '12df'
  6. let bool = new Boolean('fd');
  7. bool.valueOf(); // true
  8. // 特殊对象, valueof返回日期的毫秒形式
  9. let a = new Date();
  10. a.valueOf(); // 1515143895500
  11. // 剩下的返回的都是this,对象本身
  12. var a = new Array();
  13. a.valueOf() === a; // true
  14. var b = new Object({});
  15. b.valueOf() === b; // true
  16. // 二次封装的toString(), 方法
  17. var num = new Number('123sd');
  18. num.toString(); // 'NaN'
  19. var str = new String('12df');
  20. str.toString(); // '12df'
  21. var bool = new Boolean('fd');
  22. bool.toString(); // 'true'
  23. var arr = new Array(1,2);
  24. arr.toString(); // '1,2'
  25. var d = new Date();
  26. d.toString(); // "Wed Oct 11 2017 08:00:00 GMT+0800 (中国标准时间)"
  27. var func = function () {}
  28. func.toString(); // "function () {}"
  29. // 原生的会返回对象的类型
  30. var obj = new Object({});
  31. obj.toString(); // "[object Object]"
  32. 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

  1. 当一侧为String,被识别为字符串拼接,并会优先将另一侧转换为字符串
  2. 当一侧为Number,另一侧为原始类型,则将原始类型转换为Number类型。
  3. 当一侧为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,包括自身

javaScript 就是特级超级语言,必须烂