当前位置: 首页 > Web前端 > JavaScript

typeof和instanceof的区别

时间:2023-03-27 18:08:13 JavaScript

typeof和instanceof都可以用来判断变量,用法也大不相同。typeof返回一个变量的基本类型,instanceof返回一个布尔值。它是用来判断对象和函数的,不是用来判断字符串和数字等的。*首先,instanceofinstanceof操作符是用来检测一个对象的原型链中是否有构造函数的原型属性。语法objectinstanceofconstructor说明instanceof运算符用于检查参数对象的原型链上是否存在constructor.prototype。*理解:object.__proto__===constructor.prototype?=>boolean定义构造函数C(){}functionD(){}varo=newC();oinstanceofC;//true,因为Object.getPrototypeOf(o)===C.prototype//扩展:可以理解为o.__proto__===C.prototypeoinstanceofD;//false,D.prototype不在ooinstaceofObject的原型链上;//true,Object.prototype.isPrototypeOf(o)returnstrueC.prototypeinstanceofObject//true,同上C.prototype={};varo2=newC();o2instanceofC;//trueoinstanceofC;//false,C.prototype指向一个空对象,它不在oD.prototype=newC();的原型链上//继承varo3=newD();o3instanceofD;//trueo3instanceofC;//trueifexpressed如果表达式objinstanceofFoo返回true,并不意味着表达式永远返回true,因为Foo.prototype属性的值可能会改变,而改变后的值可能不存在于原型链中对象。这时候原表达式的值就变成了false。还有一种情况,原表达式的值也会发生变化,就是改变对象obj的原型链的情况。虽然在目前的ES规范中,我们只能读取对象的原型而不能更改它,但是借助于非标准的__proto__魔法属性是可用的。比如obj.__proto__={}执行后,objinstanceofFoo会返回false。String和Date对象也属于Object类型varsimpleStr="somesimplestring";varmyString=newString();varnewStr=newString("Stringcreatedwithconstructor");varmyDate=newDate();varmyObj={};simpleStrinstanceof字符串;//false,检查原型链会发现undefinedmyStringinstanceofString;//truenewStrinstanceofString;//truemyStringinstanceof对象;//truemyObjinstanceof对象;//true({})instanceof对象;//truemyStringinstanceofDate;//falsemyDateinstanceofDate;//truemyDate实例对象;//truemyDateinstanceofString;//falsetypeoftypeof运算符返回一个字符串,指示未计算的操作数的类型。最新的ECMAScript标准定义了8种数据类型:6种原始类型,使用typeof运算符检查::typeofinstance==="stringBigInt:typeofinstance==="bigint"符号:typeofinstance==="symbol"null:typeofinstance==="object"。对象:typeofinstance==="object"。任何特殊的非数据结构类型,它是构造对象的实例,也用作数据结构:newObject、newArray、newMap、newSet、newWeakMap、newWeakSet、newDate,以及几乎所有用新关键字。请记住,typeof运算符的唯一目的是检查数据类型,如果我们要检查从Object派生的任何结构类型,则使用typeof将不起作用,因为我们将始终得到“object”。检查对象类型的正确方法是使用instanceof关键字。但即使这样也有错误。(以上摘自MDNWebDocs)如果我们要判断一个变量是否存在,可以使用typeof:(不能使用if(a)如果a没有声明,会报错)if(typeofa!='undefined'){//variable有}typeof判断数据类型,返回值为6个字符串,分别是string、boolean、number、function、object、undefined。vara=[34,4,3,54],b=34,c='adsfas',d=function(){},e=true,f=null,g;console.log(typeof(a));//objectconsole.log(typeof(b));//numberconsole.log(typeof(c));//stringconsole.log(typeof(d));//functionconsole.log(typeof(e));//booleanconsole.log(typeof(f));//objectconsole.log(typeof(g));//undefined但是你可能会发现typeof判断的是null、数组、对象和函数实例(new+function),所有的对象都得到了。这使得判断这些数据类型时无法得到真实的数据类型。这导致了instanceof。instanceof判断对象是谁的实例,我们也知道instanceof是一个对象操作符。这里的实例涉及对象的继承,其判断是根据原型链查找。如果对象obj1的原型链上存在另一个对象obj2的原型属性,则表达式(obj1instanceofobj2)返回true;否则返回假。总结:typeof判断所有变量的类型,返回值包括number、boolean、string、function、object、undefined。typeof只能为丰富的对象实例返回“Object”字符串。instanceof用于判断对象,代码形式为obj1instanceofobj2(obj1是否是obj2的实例),obj2必须是对象,否则会报错!它的返回值是一个布尔值。instanceof可以判断不同的对象实例。判断方法是根据对象的原型链向下查询。如果obj2的prototype属性存在于obj1的原型链中,则(obj1instanceofobj2)的值为true。