- 从定义来讲,类型转换,就是将值从一种类型转为另一个种类型(显式转换)。
另外还有一种隐式的转换,也成为强制类型转换。
1 | var a = 42 |
字符串拼接
1 | const a = 100 + 10 // 110 |
==
1 | 100 == '100' // true |
建议:除了 == null 外,其他都用 === :
1 | const obj = { x: 100 } |
if 语句和逻辑运算
!!转换符 可以取到 该值的布尔值
以下都是 falsely 变量。除此之外,都是 truly 变量
1 | !!0 === false |
注意:!!{} 是 true 、 !![] 是 true
逻辑判断
1 | 10 && 0 // 0 |
ES5规范,定义了部分转换规则:( ToString 、 ToNumber、ToBoolean、 ToOrimitive )
ToString:
(1) 基本类型:
null => ‘null’ 、 undefined => ‘undefined’ 、 true => ‘true’ 、 2 => ‘2’
(2) 极小值和极大值单独处理:
1 | var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 |
(3) 对象:
1 | var toString = Object.prototype.toString; |
(4) 数组:
数组的 toString ,将所有单元字符串化,然后用’,’连接起来
1 | var a = [1,2,3] |
(5) JSON.stringify()
分为对象 和 数组的不同处理 :
对象时,会忽略 undefined function symbol
数组时,会把 undefined function symbol 转为 null
不能处理包含循环引用的对象
1 |
|
额外知识:
我们可以向 JSON.stringify(..) 传递一个可选参数 replacer, 它可以是数组或者函数, 用 来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除.
如果 replacer 是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象 的属性名称,除此之外其他的属性则被忽略。
如果 replacer 是一个函数, 它会对对象本身调用一次, 然后对对象中的每个属性各调用 一次,每次传递两个参数,键和值。如果要忽略某个键就返回 undefined ,否则返回指定 的值。
1 | var a = { |
ToNumber
true => 1 、false => 0 、 undefined => NaN 、 null => 0
处理对象、数组,会看处理值,是否内部有 valueOf() 方法,有则调用并返回基本类型值,使用该值进行强制类型转换
没有则使用 toString() 的返回值来进行强制类型转换。
如果这两个方法都没返回基本类型值,会产生 TypeError 错误。
ToBoolean
以下这些是假值:
• undefined
• null
• false
• +0 、 -0 和 NaN
• “”
推荐使用 Boolean() 和 !! 来显示转换布尔值。
顺路说一条parseInt的奇特题目:
[1,2,3].map(parseInt) // [1, NaN, NaN]
parseInt api 和 map api都要了解,才能正确解答此题。
参考:
segmentFault parseInt题解析
(你不知道的js《中卷》)[]
- 本文标题:类型转换
- 本文作者:Jonnzer
- 创建时间:2021-07-13 09:30:00
- 本文链接:https://jonnzer.github.io/2021/07/13/JS/类型转换/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!