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方法

toStringObject 原型方法,调用该方法,默认返回当前对象的 [[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自行搜索

Mark24

Everything can Mix.