1. 万能检测法:
Object.prototype.toString.call('').slice(8, -1).toLowerCase()
// ‘string’
Object.prototype.toString.call([]).slice(8, -1).toLowerCase()
// ‘array’
2. 基础类型检测
// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写
typeof Number(1) === 'number'; // 但不要使用这种形式!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof总是返回一个字符串
typeof String("abc") === 'string'; // 但不要使用这种形式!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 但不要使用这种形式!
// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';
// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
// Objects
typeof {a:1} === 'object';
typeof null === 'object';
// 使用Array.isArray 或者 Object.prototype.toString.call
// 区分数组,普通对象
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// 下面的容易令人迷惑,不要使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';
// 函数
typeof function(){} === 'function';
typeof class C{} === 'function'
typeof Math.sin === 'function';
typeof new Function() === 'function';
注: 不能检测 null , [] 返回"object"
3. 检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);
// expected output: true
console.log(auto instanceof Object);
// expected output: true
注: 无法检测基本数据类型
4. constructor
//数字
var num =12345
console.log(num.constructor) //ƒ Number() { [native code] }
//布尔值
console.log(true.constructor) //ƒ Boolean() { [native code] }
//字符串
var str = 'hello world'
console.log(str.constructor) // ƒ String() { [native code] }
//函数
function fun() {}
console.log(fun.constructor) // ƒ Function() { [native code] }
//数组
var arr=[1,2,3,4]
console.log(arr.constructor) // ƒ Array() { [native code] }
//对象
var obj = {name:'ZhangSan', age:25}
console.log(obj.constructor) // ƒ Object() { [native code] }
注: 不能检测 null 和 undefined