javascript中关于类型判断的一些疑惑小结
前言
类型判断是我们在日常工作中经常会遇到的一个功能,本文将给大家详细介绍关于javascript类型判断的相关内容,下面话不多说了,来一起看看详细的介绍吧
Javascript中数据类型分为两种:
- 简单数据类型:Undefined,NULL,Boolean,Number,String
- 复杂数据类型:Object
接下来我们就来看看怎么做数据类型判别吧?
首先来看看typeof
| Type | Result |
|---|---|
| Undefined | "undefined" |
| Null | "object"(seebelow) |
| Boolean | "boolean" |
| Number | "number" |
| String | "string" |
| Symbol(newinECMAScript2015) | "symbol" |
| Hostobject(providedbytheJSenvironment) | Implementation-dependent |
| Functionobject(implements[[Call]]inECMA-262terms) | "function" |
| Anyotherobject | "object" |
来点codedemo吧
leta=undefined;
typeofa
"undefined"
letb=false;
typeofb
"boolean"
letc=12;
typeofc
"number"
letd='12';
typeofd
"string"
letf=function(){};
typeoff
"function"
接下来我们就来看看那些奇怪的现象吧
letstr=newString('abc');
typeofstr
"object"
letnum=newNumber(12);
typeofnum
"object"
varfunc=newFunction();
typeoffunc;
"function"
typeofnull
"object"
使用构造函数创建的变量,使用typeof判断会返回“object”结果,但是Function函数例外,由它创建的变量typeof返回的是“function”
接着就来说说typeofnull=="object"。这个相信前端开发的小伙伴都知道是这个结果了,Butwhy?这其实是javascript第一个版本就存在的一个bug,历史原因可以看看这篇文章Thehistoryoftypeofnull
关于如何判断数组
letarr=[1,2,3]; typeofarr "object"
上面这个结果大家应该不陌生,那该如何正确判断数组类型呢
1、instanceof
arrinstanceofArray//true
2、isArray
Array.isArray(arr)//true
3、constructor.name
arr.constructor.name//"Array"
第三种用法用的人应该比较少,不少前端的的小伙伴都没用过。对于复杂类型Object,它的每个实例都有constructor属性。
instanceofvsisArray
当检测Array实例时,Array.isArray优于instanceof,因为Array.isArray能检测iframes.
variframe=document.createElement('iframe');
document.body.appendChild(iframe);
xArray=window.frames[window.frames.length-1].Array;
vararr=newxArray(1,2,3);//[1,2,3]
//CorrectlycheckingforArray
Array.isArray(arr);//true
//Consideredharmful,becausedoesn'tworkthoughiframes
arrinstanceofArray;//false
这段代码是从MDNcopy的。补充以下结果,发现第三种方法constructor.name也能正确判断出。
arr.constructor.name//"Array"
关于NaN
使用isNaN判断NaN。
isNaN(1/'a')//true
我们知道NaN==NaN结果是false,那如何判断两个NaN变量呢?
比较两个NaN变量,使用es6的Object.is()即可。
letnan1=NaN letnan2=NaN Object.is(nan1,nan2) true
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。