分类
简单数据类型(简单数据类型),存储在栈中
1. Number(数值)
2. String(字符串)
3. Null(空)
4. undefined(未定义)
5. Symbol(原始数据类型)
6. Bigint(大整数)
7. Boolean(布尔)
引用数据类型(复杂数据类型),存储于堆中
1.Object(对象) 包括基本的对象、函数(Function)、数组(Array)和内置对象(Date等)
类型判断
1.使用 typeof
得到的结果是一个字符串
var b = 12
console.log(typeof b)// number
///
b = '12'
console.log(typeof b) // string
b = null
console.log(typeof b) // object
b = []
console.log(typeof b) // object
b = []
console.log(typeof b) // object
使用t
ypeof
判断null
时,所得到的结果是object
,具体原因 参考https://blog.csdn.net/qq_35508835/article/details/108299244,使用typeof
判断复杂数据类型,所得到的结果是object
,所以typeof
判断不了引用数据类型和null
- 使用
instanceof
判断数据类型
var obj = {}
obj instanceof Object//true
var arr= []
arr instanceof Array//true
var str = 'xxx'
str instanceof String // false
实现原理
function myInstanceof(left, right) {
// 这里先用typeof来判断基础数据类型,如果是,直接返回false
if(typeof left !== 'object' || left === null) return false;
// getProtypeOf是Object对象自带的API,能够拿到参数的原型对象
let proto = Object.getPrototypeOf(left);
while(true) {
if(proto === null) return false;
if(proto === right.prototype) return true;//找到相同原型对象,返回true
proto = Object.getPrototypeof(proto);
}
}
用于检测构造函数的
prototype
属性是否出现在某个实例对象的原型链上,返回的是一个bool值
可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型
- 使用
Object.prototype.toString.call()
判断数据类型
返回"[object, 类型]",注意返回的格式及大小写,前面是小写,后面是首字母大写
Object.prototype.toString.call(999) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
Object.prototype.toString.call(42n) // "[object BigInt]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(true) // "[object Boolean]
能判断基础数据类型和复杂数据类型,但是过于繁琐
本文含有隐藏内容,请 开通VIP 后查看