一, 类型转换先说类型
类型转换指将一种类型转换为另一种类型, 那我们首先来说说 JavaScript 中的类型.
1.1 原始 (Primitive) 数据类型
- Null
- Undefined
- Boolean
- String
- Number
- Symbol
- BigInt
BigInt 是一种新的数据类型, 用于当整数值大于 Number 数据类型支持的范围时. 这种数据类型允许我们安全地对大整数执行算术操作, 表示高分辨率的时间戳, 使用大整数 id, 等等, 而不需要使用库. 重要的是要记住, 不能使用 Number 和 BigInt 操作数的混合执行算术运算, 需要通过显式转换其中的一种类型. 此外, 出于兼容性原因, 不允许在 BigInt 上使用一元加号 (+) 运算符.
1.2 引用 (Object) 数据类型
JavaScript 中内置了很多对象.
- Array
- Array
- ArrayBuffer
- AsyncFunction
- Atomics
- BigInt
- BigInt64Array
- BigUint64Array
- Boolean
- DataView
- Date
- Error
- EvalError
- Float32Array
- Float64Array
- Function
- Generator
- GeneratorFunction
- Infinity
- Int16Array
- Int32Array
- Int8Array
- InternalError
- Intl
- Intl.Collator
- Intl.DateTimeFormat
- Intl.ListFormat
- Intl.Locale
- Intl.NumberFormat
- Intl.PluralRules
- Intl.RelativeTimeFormat
- JSON
- Map
- Math
- NaN
- Number
- Object
- Promise
- Proxy
- RangeError
- ReferenceError
- Reflect
- RegExp
- Set
- SharedArrayBuffer
- String
- Symbol
- SyntaxError
- TypeError
- TypedArray
- URIError
- Uint16Array
- Uint32Array
- Uint8Array
- Uint8ClampedArray
- WeakMap
- WeakSet
- webAssembly
- decodeURI()
- decodeURIComponent()
- encodeURI()
- encodeURIComponent()
- escape()
- eval()
- globalThis
- isFinite()
- isNaN()
- null
- parseFloat
- parseInt
- undefined
- unescape()
- uneval()
详情请参考 MDN,
大家不要看 JavaScript 的内置对象这么多, 转换时只需要把这么统统当做一个类型引用类型进行转换就行, 在 JavaScript 内部中转换也不会考虑这么多.
二, 自动装箱
为了方便操作基本数据类型, ECMAScript 还提供了三个特殊的引用类型, 基本包装类型, String,Boolean,Number. 有了这三个类型, 在需要的时候, 原始类型会自动转换成相应的包装对象(这个过程叫自动装箱). 自动装箱就是临时创建一个包装对象, 将原始类型的值封装起来, 以便调用包装对象的函数. 但是原来那个变量的值不会有任何变化!
字符串是基本数据类型, 为撒能调用方法了, 这其实在后台进行了一系列的操作
创建 String 类型的一个实例
在实例上调用指定的方法.
销毁这个实例.
当然, 你可以将 Boolean ,Number ,String 这三个函数当作构造函数来使用, 通过手动 new 包装类来装箱(得到包装对象):
三, 类型转换的规则
四, 内部用于实现类型转换的 4 个函数
4.1 ToPrimitive ( input [ , PreferredType ] )
ToPrimitive 将 input 装换为基本数据类型, PreferredType 要么不传, 要么是 number,string.
4.1.1 PreferredType 为 number
如果 input 本身就是原始类型, 直接返回 input.
调用 input.valueOf(), 如果结果是原始类型, 则返回这个结果.
调用 input.toString(), 如果结果是原始类型, 则返回这个结果.
抛出 TypeError 异常.
4.1.2 PreferredType 为 string
如果 input 本身就是原始类型, 直接返回 input.
调用 input.toString(), 如果结果是原始类型, 则返回这个结果.
调用 input.valueOf(), 如果结果是原始类型, 则返回这个结果.
抛出 TypeError 异常.
4.1.3 PreferredType 不传入
如果 input 是内置的 Date 类型, PreferredType 视为 String
否则 PreferredType 视为 Number.
来看看这道网上的面试题
+ 号操作符, 只有当左右两边的类型相同 (都为 string 或者 number) 是才进行操作. 所以会经历如下步骤:
{}和 1 都会调用 ToPrimitive,1 原始类型直接返回.
{}内部调用 DefaultNumber, 使用 valueOf 方法, 返回 object.
在调用 toString 方法, 返回[object, object].
所以最后的结果就是[object, object]1.
这一类转换换汤不换药, 转换规则都是这样的.
4.2 ToBoolean ( argument )
4.3 ToNumber( argument )
4.4 ToString( argument )
来源: http://www.jianshu.com/p/9fbe1b70fb0b