在javascript中,typeof和instanceof是判断数据类型的两种常用方法。本文旨在通过介绍这两种方法,分析它们的不足并提出优化方案。
类型
-
Type返回表达式的数据类型的字符串,返回的结果是javascript中的基本数据类型,包括六种数据类型:数字、布尔值、字符串、对象、未定义和函数。
100型;//number typeof(1==1);//booleantype of“one pixel”;//string typeof { };//object type of one pixel;//undefinedtypeof ParSeint;//functiontype of[];//新日期的对象类型();//对象可以看出,typeof可以准确判断对象以外的基本数据类型,但无法区分对象类型的具体类型,如Array、Date、自定义类等。
实例f
-
Instanceof意在判断A是否是B的实例对象,表达式为:A是B的实例,如果A是B的实例,则返回true,否则返回false。这里需要特别注意的是:instanceof检测原型,那么如何检测呢?我们使用一个伪代码来模拟它的内部执行过程:
实例f (A,B)={ var L=A . _ _ proto _ _;var R=B .原型;如果(L===R) {//A的内部属性__proto__指向原型对象,则返回B的true}返回false}从上面的过程可以看出,当a的__proto__指向b的原型时,就认为a是b的实例对象,那么我们来看几个例子:
数组的[]实例;//对象的true{}实例;//日期的truenew Date()实例;//true function Person(){ };人员的新人员实例;对象的[]实例;//对象的truenew Date()实例;//查看对象的人员实例;//true从上面的例子中,我们发现虽然instanceof可以正确判断[]是Array的一个实例object,但不能分辨[]不是Object的一个实例Object。为什么呢?我们需要从javascript的原型链开始。首先,我们将分析[]、Array和object之间的关系。根据实例的判断,[]。_ _ proto _ _ _-array . prototype,而Array.prototype. _ _ proto _ _指向Object.prototype和Object.prototype. _ _ proto _ _指向null,标志着原型链的结束。(ps:请阅读关于JS原型链:关于javascript原型和原型链)因此,[],Array和Object组成了一个原型链:
从原型链可以看出【】的__proto__最终指向对象,原型类似的新Date()和新Person()也会形成这样的原型链。因此,我们不能完全准确地用instanceof来判断Object类的具体数据类型。
最佳建议
-
对于这个问题,在阅读jQuery源代码的时候,我找到了更好的解决方案。由于源代码之间存在相互调用,不方便阅读理解,所以按照其思路进行了整理和打包。代码如下:
(function(){ var class 2 type={ };变量类型列表='布尔数字字符串函数数组日期正则表达式对象错误符号'。拆分(“”);typeList.eachEach每个(函数(项){ class 2 type[' object ' item ']]=item . tolowercase();}返回{ getobjtype : function(obj){ if(obj==null){ return obj“”;} if(type of obj==' object ' | | type of obj==' function '){ class 2 type[ToString . call(obj)]| | ' object ' } else { return type of obj;} } } })))JavaScript中的typeof和instanceof常用来判断变量是否为空或者是什么类型。但是它们之间有区别:
类型
Typeof是一元运算,放在操作数之前,操作数可以是任何类型。
它的返回值是描述操作数类型的字符串。Typeof一般只能返回以下结果:
数字,布尔值,字符串,函数,对象,未定义。我们可以使用类型来获取一个变量是否存在,如if(typeof a!='undefined'){alert('ok')},而不要去使用如果(a)因为如果a不存在(未声明)则会出错,对于数组,空等特殊对象使用类型一律返回对象,这正是类型的局限性。
网上的一个小例子:
!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。org/TR/XHTML 1/DTD/XHTML 1-Transitional。DTD ' html xmlns=' http://www .w3。org/1999/XHTML ' hearteta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8 '/脚本语言=' JavaScript '类型=' text/JavaScript '文档。write(' type of(1): ' type of(1)' br ');文件。write(' type of(NAn): ' type of(NAn)' br ');document.write ('typeof(数字。最小值): '类型的(数字. MIN _ VALUE)' br ');文件。写('(Infinity)的类型: '的类型(Infinity)' br ');文件。写入('(类型为( ' 123 '): '类型为(' 123 ')' br ');文件。write(' type of(true): ' type of(true)' br ');文件。write(' type of(window): ' type of(window)' br ');文件。写入('(Array())的类型): '的类型(new Array())' br ');文件。write('(function(){ })的类型): ' function(){ })' br ');文件。write(' type of(document): ' type of(document)' br ');文件。write(' type of(null): ' type of(null)' br ');文件。write('(eval)的类型: ' of(eval)' br ');文件。写('(日期)的类型: '的类型(日期)' br ');文件。write(' type of(SSS): ' type of(SSS)' br ');文件。write(' type of(undefined): ' type of(undefined)' br ')/脚本标题JavaScript类型测试的/title/head body/body/html实例
实例:实例,例子
例如b?alert(" true "): alert(" false ");//a是b的实例?真:假
实例f用于判断一个变量是否某个对象的实例,如var a=新数组();警报(数组的实例);会返回没错,同时警报(对象的实例)也会返回真的;这是因为排列是目标的子类。再如:函数测试(){ };var a=新测试();警报(测试实例)会返回谈到实例f我们要多插入一个问题,就是功能的争论,我们大家也许都认为争论是一个数组,但如果使用instaceof去测试会发现争论不是一个排列对象,尽管看起来很像。
另外:
测试var a=新数组();如果(对象的实例)警报("是");else alert(' N ');
得你好
但如果(对象的窗口实例)警报("是");else alert(' N ');
得不
所以,这里的实例f测试的目标是指射流研究…语法中的对象,不是指数字正射影像图模型对象。
使用类型会有些区别
警报(类型(窗口))会得目标
大家知道Java脚本语言中判断函数参数类型是用类型还是实例f吗?
类型只能判断射流研究…已有的几个类型,如功能、对象、数字。
而实例f可以判断对象是由哪个函数实例化出来的,如:
var a=函数(x){ };var b=函数(x){ };var c=新a(1);var d=新a(2);例如a为真实的而实例b为假的。
而用c的类型和d型的结果都是目标
"判断函数参数类型"需要根据你的需求来选择用哪个。