JavaScript 中 typeof 和 instanceof 经常用来判断一个变量是什么类型的,或者判断是否为空。它们二者之间还是有区别的:
typeof
typeof 是一个一元运算符,放在运算数(表达式)之前,运算数可以是任意数据类型。
它返回值是一个字符串,一个用来表示 运算数(表达式)的 数据类型 的 字符串。该字符串 说明运算数的 类型。
typeof 一般只能返回如下几个结果:
"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
运算数为数字 typeof(x) = "number"
字符串 typeof(x) = "string"
布尔值 typeof(x) = "boolean"
对象,数组和null typeof(x) = "object"
函数 typeof(x) = "function"
【 实例:】来看个例子 在控制台直接测试结果
console.log(typeof(1)); //number
console.log(typeof("123")); //string
var obj = new Object();
console.log(typeof(obj)); //object
var obj02 = {};
console.log(typeof(obj02)); //object
var arr = [];
console.log(typeof(arr)); //object
console.log(typeof(null)); //object
function fn(){}
console.log(typeof(fn)); //function
console.log(typeof(undefined)); //undefined
通过上面的例子可以看到 ,在 JavaScript 中,判断一个变量的类型会用 typeof 运算符,但是当对象是 object、array、null 这些引用类型存储的数据时,一律返回 Object 对象类型。要想知道是到底是哪个数据类型怎么办呢?这就要用到 instanceof 运算符了
instanceof
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
返回值只有 true 和 false
语法:
object instanceof construction
参数说明:(和语法上下对照看)
某个对象 是否是 某个构造函数
A 是否是 B数据类型( Array Object Function )
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上
【 实例:】
var obj = {}
console.log(obj instanceof Object); // true
var arr = [];
console.log(arr instanceof Object);// true
【实例 :】
var obj = {}
console.log(obj instanceof Object);//true
var arr = [];
console.log(arr instanceof Object);//true array是Objec的子类 (array也是Object)
console.log(arr instanceof Array);//true
function test(){};
var a = new test();
console.log(a instanceof test);//true
function test02(){};
var a = new test02();
console.log(a instanceof test02);//true 变量 a 是 test02的实例 a存在于 test02.prototype的原型链上
console.log(a === test02); //false 变量 a 是实例对象 test02是函数 ===是绝对相等,数值和类型必须都相同才是true
console.log(a instanceof Function); //false
console.log(typeof(a));//object
总结的看下
console.log(object instanceof Object);//true
console.log(function instanceof Function);//true
console.log(function instanceof Object);//true
console.log(foo instanceof Function);//true
console.log(number instanceof Number);//false
console.log(string instanceof String);//false 这两个基本数据类型使用typeof来判断 就是true了
console.log(foo instanceof Foo);//false
若要精准的判断是哪种数据类型呢? JavaScript 中一切都是对象,任何都不例外。通过Object.prototype.toString方法,就能精准判断某个对象值属于哪种类型。直接看实例:
console.log(Object.prototype.toString.call(123))//[object Number]
console.log(Object.prototype.toString.call('123'));//[object String]
var str = 'abc';
console.log(Object.prototype.toString.call(str));//[object String]
var arr02 = [];
console.log(Object.prototype.toString.call(arr02));//[object Array]
var obj03 = {}
console.log(Object.prototype.toString.call(obj03));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call(null));// [object Null]
console.log(Object.prototype.toString.call(true));//[object Boolean]
Object.prototype.toString 这个方法里面涉及原型和原型链的知识点,会在后面总结出来的!
我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正。