javascript中关于类型判断的一些疑惑小结
前言
类型判断是我们在日常工作中经常会遇到的一个功能,本文将给大家详细介绍关于javascript类型判断的相关内容,下面话不多说了,来一起看看详细的介绍吧
javascript中数据类型分为两种:
- 简单数据类型:undefined, null, boolean, number, string
- 复杂数据类型:object
接下来我们就来看看怎么做数据类型判别吧?
首先来看看 typeof
type | result |
---|---|
undefined | "undefined" |
null | "object" (see below) |
boolean | "boolean" |
number | "number" |
string | "string" |
symbol (new in ecmascript 2015) | "symbol" |
host object (provided by the js environment) | implementation-dependent |
function object (implements [[call]] in ecma-262 terms) | "function" |
any other object | "object" |
来点code demo吧
let a = undefined; typeof a "undefined" let b = false; typeof b "boolean" let c = 12; typeof c "number" let d = '12'; typeof d "string" let f = function () {}; typeof f "function"
接下来我们就来看看那些奇怪的现象吧
let str = new string('abc'); typeof str "object" let num = new number(12); typeof num "object" var func = new function(); typeof func; "function" typeof null "object"
使用构造函数创建的变量,使用typeof判断会返回“object”结果,但是function函数例外,由它创建的变量typeof返回的是“function”
接着就来说说typeof null == "object"。这个相信前端开发的小伙伴都知道是这个结果了,but why? 这其实是javascript第一个版本就存在的一个bug,历史原因可以看看这篇文章the history of typeof null
关于如何判断数组
let arr = [1, 2, 3]; typeof arr "object"
上面这个结果大家应该不陌生,那该如何正确判断数组类型呢
1、instanceof
arr instanceof array //true
2、isarray
array.isarray(arr) // true
3、constructor.name
arr.constructor.name // "array"
第三种用法用的人应该比较少,不少前端的的小伙伴都没用过。对于复杂类型object,它的每个实例都有constructor属性。
instanceof vs isarray
当检测array实例时, array.isarray 优于 instanceof,因为array.isarray能检测iframes.
var iframe = document.createelement('iframe'); document.body.appendchild(iframe); xarray = window.frames[window.frames.length-1].array; var arr = new xarray(1,2,3); // [1,2,3] // correctly checking for array array.isarray(arr); // true // considered harmful, because doesn't work though iframes arr instanceof array; // false
这段代码是从mdn copy的。补充以下结果,发现第三种方法constructor.name也能正确判断出。
arr.constructor.name //"array"
关于nan
使用isnan判断nan。
isnan(1/'a') // true
我们知道nan == nan结果是false,那如何判断两个nan变量呢?
比较两个nan变量,使用es6的object.is()即可。
let nan1 = nan let nan2 = nan object.is(nan1, nan2) true
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。