typeof
对于原始数据类型(undefined String Number Boolean null)来说 ,除了null都可以调用typeof显示正确的类型。
typeof null=object //null是一个空对象指针
typeof最适合用来判断一个变量是否为原始数据类型。对引用值的作用不大。我们想知道的是它是什么类型的对象,而不是它是不是对象。
对于引用数据类型来说,除了函数之外,都会显示object。
typeof console.log // 'function'
instanceof
内部机制是通过判断对象的原型链中是否能找到类型的prototype。只能用来判断引用类型,因为基本数据类型没有原型。
手写instanceof(原型链的向上查找):
function getInstanceof(left,right) {
//基本数据类型直接返回false
if((typeof left!=='object'&& typeof left!=='function') || left===null)return false
let proto=left.__proto__
//等价于let proto=Object.getPrototypeOf(left)
while (true){
//查找到尽头 还没找到
if(proto===null)return false
//找到相同的原型对象
if(proto==right.prototype){
return true
}
proto=proto.__proto__
}
}
Object.prototype.toString.call()
判断所有的数据类型:
Object.prototype.toString.call(123) //[object Number]
Object.prototype.toString.call('123') //[object String]
Object.prototype.toString.call(undefined) //[object Undefined]
Object.prototype.toString.call(true) //[object Boolean]
Object.prototype.toString.call({}) //[object Object]
Object.prototype.toString.call([]) //[object Array]
Object.prototype.toString.call(function(){}) //[object Function]
Object.prototype.toString.call(Function) //[object Function]
Object.prototype.toString.call(null) //[[object Null]]
Object.prototype.toString.call(new Date()); //[object Date]
Object.prototype.toString.call(/at/); //[object RegExp]
精确判断所有数据类型的函数:
function getType(obj) {
if(obj===null)return String(obj)
return typeof obj==='object' ? Object.prototype.toString.call(obj).replace('[object ','').replace(']','') : typeof obj
}
判断是否是数组?
instanceof
if(value instanceof Array){
//操作数组
}
Array.isArray()
if(Array.isArray(value)){
//操作数组
}
Object.prototype.toString.call()
const isArray=function (target) {
return Object.prototype.toString.call(target)===`[object ${Array}]`
}
}
if(isArray(value)){
//操作数组
}
[].constructor === Array
if(value.constructor === Array){
//操作数组
}
判断null
- 最简单的是通过null===null来判断是否为null
- 通过原型链的尽头:Object.prototype.proto===a判断a是否为原始对象类型即null
- type(a)=='object' && !a 通过typeof判断null为对象,且对象类型只有null转换为Boolean为false