一、typeof
用法:只能判断string, number,boolean,undefined,symbol,function,object(null亦会判为object)
console.log(typeof 'q'); // string
console.log(typeof 1); // number
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof Symbol()); // symbol
console.log(typeof function (){}); // function
console.log(typeof null); // object
console.log(typeof {}); // object
原理:根据不同变量的类型信息在底层表示的二进制不同。
000: 对象, 1: 整数 010: 浮点数 100: 字符串 110: 布尔值 undefined: 用-(-2^30表示)null : 对应机器码的NULL指针,全是零。因为null全部是0, 所以前三位也是000, 就被判断为object。
二、Object.prototype.toString.call()
console.log(Object.prototype.toString.call('q')); // [object String]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(Symbol())); // [object Symbol]
console.log(Object.prototype.toString.call(function (){})); // [object Function]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(new Date())); // [object Date]
console.log(Object.prototype.toString.call(new Error())); // [object Error]
console.log(Object.prototype.toString.call(new RegExp())); // [object RegExp]
原理:Object.prototype.toString会返回[object Type] ,type就是对象的类型。常用于判断浏览器内置对象的数据类型。
如果把Object.prototype.toString方法改写了,判断结果可能不准:
Object.prototype.toString = function (){
return 'object';
}
console.log(Object.prototype.toString.call('q')); // object
注意:使用该方法一定是要用call修改this指向。
如果直接使用toString方法,则返回数据的字符串值。例:console.log([1,2,3].toString()); // 1,2,3
直接调用的toString方法,是该数据构造函数的toString,如果是数组,其实调用的是Array.prototype.toString。
三、instanceof
console.log('q' instanceof String); // false
console.log(new String('q') instanceof String); // true
console.log(1 instanceof Number); // false
console.log(new Number(1) instanceof Number); // true
console.log(true instanceof Boolean); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(Symbol() instanceof Symbol); // false
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function(){} instanceof Function); // true
console.log(new Date() instanceof Date); // true
console.log(new Error() instanceof Error); // true
console.log(new RegExp() instanceof RegExp); // true
console.log(new RegExp() instanceof Object); // true
原理:通过对象的原型链来查找,只能查找对象的类型,原始数据类型不行。所有对象 instanceof Object 都为true。
注意:undefined和null无法判断。如果修改了对象的原型链,可能判断错误。
其他:
1、Array.isArray()
console.log(Array.isArray(new Array())); // true
console.log(Array.isArray([])); // true
console.log(Array.isArray(123)); // false