js 类型及检测方式
wyx 4/3/2023 js
# JS内置类型
# 基础类型(原始数据类型)
- undefined
- Null
- String
- Number
- Boolean
- Symbol (ES6新增)
- BigInt(ES10新增)
存储在栈内存中,在引用或拷贝时,会创建一个完全相等的变量;占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
# 引用数据类型
- Object
- Object
- Array
- RegExp
- Date
- Math
- Function
存储在堆内存,存储的是地址,多个引用指向同一个地址,这里会涉及一个“共享”的概念;占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
# 数据类型检测
# typeof
对于原始数据类型来说,除了null都可以显示正确
typeof null // object
1
对于引用数据类型,除了函数都显示object
typeof function() {} // function
1
想判断一个对象正确类型,可以使用instanceof
# instanceof
内部机制: 判断对象原型链中是不是能找到类型的prototype
可以准确判断引用数据类型,但是不能判断基础数据类型
2 instanceof Number // false
true instanceof Boolean // false
[] instanceof Array // true
1
2
3
2
3
# constructor
如果是个简单的数据,直接判断是可以准确判断出来类型的,但是如果自己创建一个对象,然后更改它的原型,constructor就不可靠了
(5).constructor === Number // true
(false).constructor === Boolean // true
({}).constructor === Object // true
function Fn(){};
fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor === Fn); // false
console.log(f.constructor === Array); // true
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# Object.prototype.toString.call()
toString()
是Object
的原型方法,调用该方法,可以统一返回格式为“[object Xxx]”
的字符串,其中Xxx
就是对象的类型。对于Object
对象,直接调用toString()
就能返回[object Object]
;而对于其他对象,则需要通过call
来调用,才能返回正确的类型信息。
Object.prototype.toString({}) // "[object Object]"
Object.prototype.toString.call({}) // 同上结果,加上call也ok
Object.prototype.toString.call(1) // "[object Number]"
1
2
3
2
3
# 全局通用的数据类型判断方法
function getType(obj){
let type = typeof obj;
if (type !== "object") { // 先进行typeof判断,如果是基础数据类型,直接返回
return type;
}
// 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); // 注意正则中间有个空格
}
/* 代码验证,需要注意大小写,哪些是typeof判断,哪些是toString判断?思考下 */
getType([]) // "Array" typeof []是object,因此toString返回
getType('123') // "string" typeof 直接返回
getType(window) // "Window" toString返回
getType(null) // "Null"首字母大写,typeof null是object,需toString来判断
getType(undefined) // "undefined" typeof 直接返回
getType() // "undefined" typeof 直接返回
getType(function(){}) // "function" typeof能判断,因此首字母小写
getType(/123/g) //"RegExp" toString返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17