1.1typeof1.1.1基本介绍typeof是一个运算符,可以有两种使用方式:(1)typeof(expression);(2)typeof变量名;返回值为String,用于描述变量的数据类型;所以可以用来判断number、string、object、boolean、function、undefined、symbol这七种类型,每种情况返回的内容如下表所示:TyperesultString'string'Number'number'Boolean'boolean'Undefined'undefined'Object'object'functionfunction'function'Symbol'symbol'1.1.2原理高级typeof方法虽然很好用,但也有一定的局限性:对于Object、array、null,返回值为object。比如typeof(window)、typeof(document)、typeof(null)返回的值都是对象。为什么?这从底层开始。js在底层存储变量时,会在变量机器码的低1-3位存储其类型信息:000:object;010:浮点数;100:字符串;110:布尔值;1:整数;特例:(1)null的机器码全部为0(2)undefined:用?2^30整数表示typeof是通过机器码来判断类型。由于null的所有机器码都是0,机器码和对象是一样的,所以直接把它当成一个对象,所以无法通过typeof来判断对象是否为null。1.1.3实验说了这么多,还没有验证,下面一一验证一下://stringconsole.log(typeof('lili'));//string//digitalconsole.log(typeof(1));//number//布尔值console.log(typeof(true));//boolean//undefinedconsole.log(typeof(undefined));//undefined//objectconsole.log(typeof({}));//object//数组console.log(typeof([]));//object//nullconsole.log(typeof(null));//object//functionconsole.log(typeof(()=>{}));//function//Symbolvalueconsole.log(typeof(Symbol()));//symbol1.2instanceof1.2.1基本介绍instanceof运算符用于检测prototype属性是否为constructor出现在一个实例对象的原型链上,返回值是一个布尔值,用来表示一个变量是否属于一个对象的实例。其语法如下:objectinstanceofconstructor1.2.2原理advancedinstanceof主要实现原理是只要右边变量的原型在左边变量的原型链上即可。因此,instanceof会遍历左边变量的原型链,直到找到右边变量的原型。如果搜索失败,它将返回false。步骤如下:获取左边变量的隐式原型(即:__proto__,可通过Object.getPrototypeOf()获取);获取右侧变量的显示原型(即:prototype);做出判断,比较leftVal。__原型__。__原型__......===rightVal。否则返回假。1.2.3实验上面介绍了instanceof的简单使用和原理,我们简单使用一下,验证一下原理:constarr=[1,2];//判断Object的原型是否在数组console的原型链上.log(arrinstanceofObject);//true//数组原型arrconstproto1=Object.getPrototypeOf(arr);console.log(proto1);//[]//数组原型arrconstproto2=Object.getPrototypeOf(原型1);console.log(proto2);//[]//Object的原型console.log(Object.prototype);//判断arr的原型是否等于Object的原型console.log(proto1===Object.prototype);//false//判断arr的原型是否等于Object的原型console.log(proto2===Object.prototype);//true代码注意。转载本文请联系风筝持有人公众号。
