Mark24
记录灵感、技术、思考
JavaScript内置类型与类型检测
1. 内置类型
ES5 有六种
Null
Undefined
Boolean
String
Number
Object
ES6 新增一种 Symbol
所以一共是7种。
1.1 分类
Object
不可定长,所以是引用类型,保存在 堆(heap)上。
其他是长度固定,因此是基本类型,保存在 栈(stack)上。
2. 类型检测
2.1 typeof检测
typeof <target>
值 | 结果(字符串) |
---|---|
‘abc’ | string |
123 | number |
{} | object |
undefined | undefined |
true | boolean |
Symbol(‘mmm’) | symbol |
六种表现正常,唯独
值 | 结果 |
---|---|
null | object |
这是一个Bug,年代悠久为了兼容性已经无法修复
引申
// 判断一个值是不是 null
```javascript
function isNull(val) {
return !val && typeof val === "object";
}
```
typeof 还有其他值
值 | 结果 |
---|---|
function(){} | function |
[] | object |
typeof 不能完全鉴定类型
2.2 toString方法
toString
是 Object
原型方法,调用该方法,默认返回当前对象的 [[Class]]
这是一个内部属性,返回格式为 [Object xxx]
对于Object对象可以直接使用
Object.toString
对于其他对象需要通过call/apply
来调用
方法:Object.prototype.toString.call(value)
值 | 结果(字符串) |
---|---|
‘abc’ | ‘[object String]’ |
123 | ‘[object Number]’ |
{} | ‘[object Object]’ |
undefined | ‘[object Undefined]’ |
null | ‘[object Null]’ |
true | ‘[object Boolean]’ |
Symbol(‘mmm’) | ‘[object Symbol]’ |
function(){} | ‘[object Function]’ |
[] | ‘[object Array]’ |
这个可以完全区分基础类型,以及 function、array
最终还是要输出内部自己的class获得,也合理,这是唯一可以依靠的。在外部API出现BUG和失误的时候,一个语言的内部属性,提供了“自省”的信息来鉴别,曲线救国。
参考信息:
- https://www.cnblogs.com/gg-qq/p/10815109.html
-
https://lucifer.ren/fe-interview/#/topics/js/buit-in-types
- MDN关于typeof和 toString自行搜索