基本数据类型
Number String Boolean Null Undefined Symbol
引用数据类型
Object Array Function Date
判断数据类型
typeof
instanceof
Object.prototype.toString
constructor
使用 typeof 判断复杂数据类型
使用 instanceof判断有原型链的引用型数据类型,但是需确保原型链未被修改过
使用 Object.prototype.toString 可以准确的判断变量的类型(万能方法)
使用 constructor 可以查看目标构造函数,也可以进行数据类型判断
使用 typeof 判断复杂数据类型
const foo = ( ) => 1
typeof foo // "function"
const foo = { }
typeof foo // "object"
const foo = [ ]
typeof foo // "object"
const foo = new Date
typeof foo // "object"
const foo = Symbol("foo")
typeof foo // "symbol"
var obj = {
name : "zhenghao"
};
console.log(typeof obj)
typeof 可以准确判断除null以外的基本数据类型,null会被判断为object.
typeof 也可以判断function,array,symbol引用型数据类型
使用 instanceof判断有原型链的引用型数据类型,但是需确保原型链未被修改过
var obj = { };
obj instanceof Object // "true"
instanceof 原理模拟
//L表示做表达式,R表示右表达式
const instanceMock = (L,R) => {
if ( typeof L !== 'Object' ){
return false
}
while ( true ){
if ( L===null ){
// 已经遍历到顶端
return false
}
if ( R.prototype === L._proto_ ){
return true
}
L = L._proto_
}
}
使用 Object.prototype.toString 可以准确的判断变量的类型(万能方法)
function foo ( ){
}
Object.prototype.toString.call(foo) // [ object Function ]
console.log(Object.prototype.toString.call(foo)) // [ object Function ]
使用 constructor 可以查看目标构造函数,也可以进行数据类型判断
当一个函数F被创建时,JS引擎会为其添加prototype原型,然后在原型上添加一个constructor属性,并让其指向F的引用。也就是说
F.prototype.constructor === F // true
当执行 var f = new F() 这时候F被当做构造函数使用,这时候F原型上的constructor就会被转移到了实例对象f上
f.constructor === F // true
null和undefined是无效的对象,是不存在constructor这个属性的