数据类型包括:基本数据类型、引用数据类型。es6
基本数据类型:Null、undefined、String、Number、Boolean、Symbol面试
引用数据类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle正则表达式
判断数据类型的方法主要有:typeof、intanceof、construtor、Object.prototype.toString.call( )、isArray(只能判断是不是数组)数组
推荐使用Object.prototype.toString.call( )markdown
返回是一个字符串,经常使用于判断基本数据类型:String、Number、Undefined、Boolean、Function,可是对象和Null和数组返回Object。函数
console.log(typeof '');//string
console.log(typeof 1);//number
console.log(typeof true);//boolean
console.log(typeof undefined);//undefined
console.log(typeof function () { });//function
console.log(typeof {});//object
console.log(typeof null);//object
console.log(typeof [1,2,3]);//object
复制代码
判断一个变量是否存在,可使用typeof:oop
注意不能使用if(a),若是a未声明,会报错:a is not defined。ui
if (typeof a != 'undefined') {
console.log("a变量存在");
} else {
console.log("a变量不存在");
}
//注意不能使用if(a),若是a未声明,会报错:a is not defined
if (a) {
console.log("1111");
} else {
console.log("222");
}
复制代码
只适合用于检测引用类型,而不能检测基本的数据类型,返回的是一个布尔值。this
只要在原型链上有构造函数都会返回true,使用instanceof检测不太准确。spa
instanceof的原理:
判断构造函数的原型链(prototype)属性是否出如今某实例的对象原型链上。
好比:A instanceof B 即B的prototype是否出如今A的原型链上。(A为实例对象,B为构造函数);
var arr = [];
console.log(arr);
console.log(arr instanceof Array);//true
console.log(arr instanceof Object);//true
let Person = function(){};
let p1 = new Person();
console.log(p1 instanceof Person);//true
let s1 = new String('leaf');
console.log(s1 instanceof String);//true
let str = "ice";
console.log(str instanceof String);//false
复制代码
instanceof实现原理,能够参考:
// 思路:顺着原型查找,知道找到相同的原型对象,返回true 不然返回false
function myInstanceof(left, right) {
// 使用typeof 判断基础数据类型
if (typeof left !== 'object' || left === null) {
return false;
}
// getPrototypeOf是Object对象自带的API,获取原型对象
let proto = Object.getPrototypeOf(left);
while (true) {
if (proto === null) {
return false;
}
// 找到相同原型对象,返回true
if (proto === right.prototype) {
return true
}
proto = Object.getPrototypeOf(proto);
}
}
复制代码
constructor这个属性存在构造函数的原型链上的属性,指向构造函数,能够经过直接访问查看构造函数上的__proto__直接查看所属类型。
var arr = [];
console.log(arr);
console.log(arr.constructor === Array);
复制代码
由于原型链的属性是能够修改的,constructor会有被修改的可能,因此不建议使用该方法:
function Person(){
}
Person.prototype = new Array();//修改Person构造函数上原型链
var myFather = new Person();
console.log(Person.constructor === Array);//false
复制代码
返回一个“[object XXX]”格式的字符串,XXX就是具体的数据类型,包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument等。
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,严格来讲,是toString运行时this指向的对象类型,返回的类型。
let myNull = null;
console.log(Object.prototype.toString.call(myNull));//[object Null]
let myUndefined = undefined;
console.log(Object.prototype.toString.call(myUndefined));//[object Undefined]
let str = 'leaf';
console.log(Object.prototype.toString.call(str));//[object String]
let arr = [];
console.log(Object.prototype.toString.call(arr));//[object Array]
let boolean = true;
console.log(Object.prototype.toString.call(boolean));//[object Boolean]
let myDate = new Date();
console.log(Object.prototype.toString.call(myDate));//[object Date]
let myFun = function (){};
console.log(Object.prototype.toString.call(myFun));//[object Function]
let myError = new Error();
console.log(Object.prototype.toString.call(myError));//[object Error]
let myReg = /leaf/;
console.log(Object.prototype.toString.call(myReg));//[object RegExp]
复制代码
最简单的判断是数组的方法,记住喽是object.prototype.toString.call()
isArray() 方法用于判断一个对象是否为数组。 若是对象是数组返回 true,不然返回 false。
const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false
复制代码
function getType(obj) {
if (typeof obj !== 'object') {
return (typeof obj)
}
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}
console.log(getType([]));//Array
console.log(getType(null));//Null
console.log(getType('123'));//string
正则复习:
// ^ 匹配的开始
// $ 匹配输入的结束
// * 匹配前一个表达式0次或屡次
// \s 匹配一个空白字符,包括空格、制表符、换页符、换行符等
// 正则表达式后的"g"是一个表示全局搜索选项或标记,将在整个字符串查找并返回全部匹配结果
复制代码
判断数组的几种方法:
if (arr instanceof Array === false) {
console.log("非数组");
return false
}
return true
复制代码
isArray() 方法用于判断一个对象是否为数组。
若是对象是数组返回 true,不然返回 false。
const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false
复制代码
let arr = [];
if(Object.prototype.toString.call(arr) === "[object Array]"){
console.log("我是数组");
return true
}
console.log("我不是数组");
return false
复制代码
判断空对象的几种方法:
for...in遍历对象属性
使用JSON.stringify
Object.keys( )
let obj = {};
for (var i in obj) {// 若是不为空对象,会执行到这里,返回true
return true
}
return false//若是空对象,返回false
}
复制代码
let obj = {};
if (JSON.stringify(obj) === "{}") {
return false
}
return true //非空对象,返回true
复制代码
ES5 引入了Object.keys
方法,返回一个数组,成员是参数对象自身的(不含继承的)全部可遍历(enumerable)属性的键名。
let obj = {};
console.log(Object.keys(obj));//[]
var obj = { foo: 'bar', baz: 42 };
console.log(Object.keys(obj));//["foo", "baz"]
复制代码
能够经过判断返回数据的长度来知道它是否为空:
let obj = {};
if (Object.keys(obj).length === 0) {
console.log("空对象");
return false
}
return true
复制代码
复习Object.keys( )的用法:
参考资料: