typeof:检测一个变量的类型,返回字符串
instanceof:判断某个实例是否为某个对象的实例,返回布尔值
使用:
- typeof(表达式)和typeof 变量名
- 变量 instanceof 类型
typeof
typeof 的返回值:
- ‘undefined’
- ‘boolean’
- ‘string’
- ‘number’
- ‘object’
- ‘function’
console.log(typeof a); //'undefined'
console.log(typeof(true)); //'boolean'
console.log(typeof NaN); //'number'
console.log(typeof null); //'object'
var obj = new String();
console.log(typeof(obj)); //'object'
console.log(typeof []); //'object'
var fn = function() {};
console.log(typeof(fn)); //'function'
PS:
返回’object’的情况:对象、数组、或者 null
1.判断是否为null,使用===
let a = null;
if (a === null) {
console.log('a是null');
}
2.判断一个变量是否存在,使用 typeof a != ‘undefined’
let a = null;
if (typeof a != 'undefined') {
console.log('变量a已经存在!');
}
instanceof
检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
object instanceof constructor
构造函数通过new可以实例对象,instanceof能判断这个对象是否是之前那个构造函数生成的对象
总结:
(1)typeof 可以判断基础数据类型(null 除外),但在引用数据类型中,除了function 类型以外,其他的无法判断
(2)instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型
(3)typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值
通用检测数据类型,可以采用Object.prototype.toString,调用该方法,统一返回格式“[object Xxx]”的字符串
Object.prototype.toString.call([]) //"[object Array]"
全局通用的数据类型判断方法:
function getType(obj) {
let type = typeof obj;
if (type !== "object") { // 先进行typeof判断,如果是基础数据类型,直接返回
return type;
}
// 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}
//简单类型
console.log(getType('123')); // "string"
console.log(getType(undefined)); // "undefined"
//引用类型
console.log(getType([])); //"Array"
console.log(getType(null)) // "Null"
console.log(getType(function() {})) // "function"
console.log(getType(/123/g)) //"RegExp"