类型转换
显式类型转换 - Number函数
- 数字 -》 数字
- 字符串 如果字符串内为数字 -> 数字; 不全部为数字 -> NaN; 空字符串 -> 0。
- 布尔值: true -> 1 false -> 0
- undefined -> NaN
- null -> 0
- 对象 -> 先执行对象的valueOf方法,如果返回原始数据类型,则使用Numbe方法。 如果返回对象数据类型,再调用toString方法,如果返回原始数据类型,则使用Number方法,如果toString再次返回一个对象数据类型,则抛出异常
显式类型转换 - String函数
- 数字 -》 相应的数字字符串
- 字符串 -> 原值
- 布尔值: true -> 'true' false -> 'false'
- undefined -> 'undefined'
- null -> 'null'
- 对象 -> 先执行对象的toString方法,如果返回原始数据类型,则使用String函数。 如果返回对象数据类型,调用valueOf方法,如果返回原始数据类型,则使用String方法,如果再次返回一个对象数据类型,则抛出异常
显式类型转换 - Boolean函数
- undefined、null、+0、-0、NAN、'' -> 均为 false; 其他均为true
隐式类型转换
常见面试题
例1:
+ []
// 结果 0
// 原理: + 运算符, 则 Number([]) -> Number([].valueOf()) -> Number([].toString()) -> + Number('')
例2:
{} + []
// 结果 0
// 原理:此处{}被认为一个空的代码块,不执行 {} + [] -> + [] 与上例一样
例3:
[] + []
//结果: ''
//原理:[] + [] -> [].valueOf().toString() + [].valueOf().toString() -> '' + ''
例4: 特别说明 火狐和谷歌上结果不一致,原因尚未知晓,大佬请留言告知
[] + {}
// 结果 "[object Object]"
// 原理 [] + {} -> [].valueOf().toString() + {}.valueOf().toString() -> '' + "[object Object]"
typeOf
typeof []
"object"
typeof undefined
"undefined"
typeof null
"object"
typeof 1
"number"
typeof true
"boolean"
typeof function() {}
"function"
typeof NaN
"number"
typeof Symbol()
"symbol"
- 说明 typeof null -> object 变量的值被设计保存在一个 32 位的内存单元中。该单元包含一个 1 或 3 位的类型标志 000 标识object ;null 二进制全是0 所以会认为null 为 object.这是一个历史遗留bug
判断一个数组
Array.isArray([])
arr instanceof Array; 判断一个对象是不是某个类型的实例
arr.constructor == Array
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。