1、typeof 判断(最常用)typeof(表达式)或typeof 变量名
typeof不能区分引用型数据的类型和 null。另我们可以使用 Array.isArray(arr) 将数组类型的数据从中筛选出来。
console.log(typeof 'Hello'); // string
2、instanceof 判断(了解)对象的判断,返回布尔值,object(实例对象) instanceof constructor(构造函数)
检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。不能很清晰方便的判断出一个实例是数组还是对象或方法。
let arr=[1,2,3];
console.log(arr instanceof Array); // true
3、Object.prototype.toString.call() 判断(最靠谱)返回字符串"[object class]",call改变调用函数作用域。要获取的是 this 对象,不加 call 改变作用域时 this 指向的是Object.prototype。
console.log(Object.prototype.toString.call('Hello')); // [object String]
若只想要String这段字符,可以封装一个函数进行过滤:
// 定义一个公共函数获取数据类型
function getTypeName(val) {
let str = Object.prototype.toString.call(val);
return /^\[object (.*)\]$/.exec(str)[1];
}
console.log(getTypeName(false)); // Boolean
4、constructor 判断(比较常用)通过数据的constrcutor
是否与其构造函数相等来判断数据的类型。
var arr = [];
arr.constructor === Array; // true
弊端:constructor
所指向的的构造函数可以被修改。
function Name(name) {
this.name = name;
}
function Stuent(age) {
this.age = age;
}
// 将构造函数Name的实例赋给Student的原型,Student的原型的构造函数会发生改变,将不再指向自身。
Stuent.prototype = new Name('张三');
Stuent.prototype.constructor === Name; // true
Stuent.prototype.constructor === Stuent; // false