javascript中typeof和instanceof 的用法区别

时间:2021-04-04 14:49:47

typeof操作符

《javascript高级程序设计》第3版中这样给typeo定义。鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof 就是负责提供这方面信息的操作符。对一个值使用typeof操作符可能会返回以下结果:number,boolean,string,object,undefined,function

alert(typeof(1));//number
alert(typeof("abc"));//string
alert(typeof(true));//boolean
alert(typeof(m));//undefined
//如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a) 若a未声明,则报错)
if(typeof a != 'undefined'){
//变量存在
}

有些时候,typeof操作符会返回一些令人迷惑但技术上正确的值,比如,调用typeof null 会返回“object”,因特殊值null被认为是一个空的对象引用。Safari5及之前版本、Chrome7及之前版本在对正则表达式调用typeof操作符时会返回“function”,而其他浏览器则返回“object”。判断数组时,不管是数组还是对象,都会返回object。所以,typeof不适用区分数组和对象

值得注意的是,typeof是一个操作符不是一个函数,因此例子中的括号尽管可以使用,但是不是必须的。

从技术角度来讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数确实有一些特殊的属性,因此用typeof操作符来区分函数和其它对象是有必要的。

instanceof 运算符

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

语法

object instanceof constructor

参数

object —— 要检测的对象.
constructor ——某个构造函数

描述

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

需要注意的是,如果表达式 obj instanceof Foo返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的proto魔法属性,是可以实现的。比如执行obj.proto= {}之后,obj instanceof Foo就会返回false了。

常用场景

instanceof检测引用数据类型,判断对象是Array,还是RegExp

var array=new Array();  
var object=new Object();
var regexp=new RegExp();
function func(){};
var func1=new func();

alert(array instanceof Array); //true
alert(object instanceof Object); //true
alert(regexp instanceof RegExp); //true
alert(func1 instanceof func); //true

typeof 和instanceof联系

  1. 其实typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的是基本数据类型,instanceof主要检测的是引用数据类型。
  2. typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。它返回值是一个字符串,该字符串说明运算数的类型。instanceof返回值为布尔。
  3. instanceof只能用来判断对象和函数,不能用来判断字符串和数字等。
  4. 用instanceof可以判断变量是否为数组,typeof不适用于来判断数组,因为不管是数组还是对象,都会返回object。