1、先判断是否为null,如果是则直接返回null
2、如果typeof的结果不是object,那么就返回typeof的结果
3、剩下的情况就是复杂数据类型,大约可以分为Object、Array、Date、RegExp以及自定义的类,前面四个可以通过Object.prototype.toString.call(val),然后截取第7位开始的部分,但是不能判断自定义类(会返回object),因此如果要获取到自定义的类名,可以通过val.__proto__.constructor.name获取。
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="btn">clickMe</button>
</body>
<!-- 需求判断出输入数据的类型,如果是实例对象,则返回构造函数的名字 -->
<script>
function type(val){
if(val===null){
// 先判断null
return null
}else if(typeof val !== 'object'){
// null以外的基本类型
return typeof val
}else{
// 所有复杂类型
return val.__proto__.constructor.name
}
}
function Child(name){
this.name = name
}
let xiaoMing = new Child('xiaoming')
console.log(type(1))
console.log(type(null))
console.log(type(undefined))
console.log(type({a:1}))
console.log(type([1,2,3]))
console.log(type(new Date()))
console.log(type(xiaoMing))
</script>
</html>
结果全部正确: