JS基础类型隐式转换,显示转换

918 阅读2分钟

一般非基础类型进行转换时会先调用 valueOf,如果 valueOf 无法返回基本类型值,就会调用 toString

1. 字符串和数字

  • "+"操作符,如果有一个为字符串,那么都转化到字符串然后执行字符串拼接。
  • "-" 操作符,转换为数字,相减 (-a, a * 1 a/1) 都能进行隐式强制类型转换。

严格模式下===,将转为数字后进行比较

2. 布尔值到数字

1 + true = 2;
1 + false = 1;

3. 转为布尔值

  • for中第二个
  • while
  • if
  • 三元表达式
  • || 和 && 左边的操作数

严格模式下===,将布尔类型转为数字后进行比较

假值列表:

  • undefined
  • null
  • false
  • +0,-0,NaN
  • ""

Number类型转换

触发number 的隐式类型转换

  • 比较操作(>, <, <=, >=)
  • 按位操作(| & ^ ~)
  • 算数操作(- + * / %), 注意,当 + 操作存在任意的操作数是 string - 类型时,不会触发 number 类型的隐式转换
  • 一 元 + 操作
  • 非严格相等操作(== 或者 != ),注意,== 操作两个操作数都是 string 类型时,不会发生 number 类型的隐式转换

例如:

+ '123' //123(number类型)
123 != "456" //true
4 > "5" //false
5 / null //Infinity
true | 0 //1

注意:undefined转number为NaNNaN与任何数据类型计算都为NaN

4. 符号(true)

  • 不能被转为数字
  • 能转成布尔值,全是true

5. 例题解析

参考文献

1. true + false //1
2. 12 / "6" //2 除号运算符将6转成number
3. "number" + 15 + 3 //"number153",有string类型
4. 15 + 3 + "number" //"18number",从左到右执行,最后做字符串相加
5. [1] > null //true,'1'>0, 1>0,true
6. "foo" + + "bar" //"fooNaN", 一元 + 运算符比二元 + 运算符具有更高的优先级,"foo" + (+"bar"),"foo" + NaN,"fooNaN"
7. "true" == true //false, == 运算符执行 number 类型转换,'true' 转换为 NaN, boolean 类型 true 转换为 1
8. false == "false" //false, 0 == NaN, false
9. null == "" //false, null 不等于任何值除了 null 和 undefined
10. !!"false" == !!"true" //true, !! 运算符将字符串 'true' 和 'false' 转为 boolean 类型 true
11. ["x"] == "x" //true, 
//== 运算符对数组类型执行 number 转换,先调用对象的 valueOf() 方法,
//结果是数组本身,不是原始类型值,所以执行对象的 toString() //方法,得到字符串 'x'
12. [] + null + 1 //null1, 先执行valueof,再执行toString
13. [1,2,3] == [1,2,3] //false
//当运算符两边类型相同时,不会执行类型转换,两个数组的内存地址不一样,所以返回 false
14. {} + [] + {} + [1]//'0[object Object]1'
//==> +[] + {} + [1]
//==> 0 + {} + [1]
//==> 0 + '[object Object]' + '1'
//==> '0[object Object]1'
15. ! + [] + [] + ![] //'truefalse'
//==> !(+[]) + [] + (![])
//==> !0 + [] + false
//==> true + [] + false
//==> true + '' + false
//==> 'truefalse'
16. new Date(0) - 0 //0
17. new Date(0) + 0 //'Thu Jan 01 1970 02:00:00 GMT+0200 (EET)0', 
//'-' 运算符执行 number 类型隐式转换对于 Date 型的值,