JavaScript数据类型检测
2018-12-20 本文已影响23人
感觉不错哦
先列举一下JavaScript中的基本数据类型
1、基本数据类型(6种)
Undefined
Null
Boolean
Number
String
Symbol (ES6新增) 符号类型
2、引用数据类型: Object
typeof基本数据类型检测
我们常说typeof是基本数据类型检测,因为typeof无法检测引用数据类型,所有的引用类型都返回Object
在实际运用中,typeof的实际场景往往是用来检测一个对象是否被定义或者赋值,而不是用来检测数据类型
var a,b=10,c='',d={}
alert(typeof a) //undefined
alert(typeof b) //number
alert(typeof c) //string
alert(typeof d) //object
需要注意的是 typeof 返回的是字符串
alert(typeof typeof d) //string
instanceof引用数据类型检测
instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。简单来讲instanceof 运算符用来检测constructor.prototype 是否存在于参数 object 的原型链上
var arr=[1,2,3]
var obj={a:1}
var reg=/\d+/
console.log(arr instanceof Array,obj instanceof Object,reg instanceof RegExp) //true true true
只对引用类型有效
var a=10
console.log(a instanceof Number) //false
稍微扩展一下用法,不深入
// 定义构造函数
function C(){}
function D(){}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype不在o的原型链上
o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.
D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为C.prototype现在在o3的原型链上
就一个要素,看原型链 左边的是否在右边的原型链上
看过我之前文章的小伙伴可能会理解下面为什么?如果看不懂没关系,一般用不上。Object._
proto_
=>null 也可以理解这里没有null
function Person() {}
console.log(Object instanceof Object); //true
//第一个Object的原型链:Object=>
//Object.__proto__ => Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Object的原型:Object=> Object.prototype
console.log(Function instanceof Function); //true
//第一个Function的原型链:Function=>Function.__proto__ => Function.prototype
//第二个Function的原型:Function=>Function.prototype
console.log(Function instanceof Object); //true
//Function=>
//Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//Object => Object.prototype
console.log(Person instanceof Function); //true
//Person=>Person.__proto__=>Function.prototype
//Function=>Function.prototype
console.log(String instanceof String); //false
//第一个String的原型链:String=>
//String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个String的原型链:String=>String.prototype
console.log(Boolean instanceof Boolean); //false
//第一个Boolean的原型链:Boolean=>
//Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Boolean的原型链:Boolean=>Boolean.prototype
console.log(Person instanceof Person); //false
//第一个Person的原型链:Person=>
//Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Person的原型链:Person=>Person.prototype
[[class]]类属性
之前我在对象深入中介绍过此属性,看过的小伙伴不知道还有没有印象
对象的类属性是个字符串,用来表示对象的类型信息,然而ES3与ES5都未设置这个属性的方法,有一种间接的方法可以查询到它
function classof(obj){
return Object.prototype.toString.call(obj)
}
console.log(classof(null)) //Null
console.log(classof(1)) //Number
console.log(classof("")) //String
console.log(classof(false)) //Boolean
console.log(classof(/./)) //RegExp
console.log(classof(undefined)) //Undefined
此方法是最好的判断方法