javascript中关于类型判断的一些疑惑小结


Posted in Javascript onOctober 14, 2018

前言

类型判断是我们在日常工作中经常会遇到的一个功能,本文将给大家详细介绍关于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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript CSS修改学习第一章 查找位置
Feb 19 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
May 15 Javascript
Jquery的each里用return true或false代替break或continue
May 21 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
jquery实现在光标位置插入内容的方法
Feb 05 Javascript
JavaScript电子时钟倒计时
Jan 09 Javascript
Bootstrap页面布局基础知识全面解析
Jun 13 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
微信小程序 template模板详解及实例
Feb 21 Javascript
js实现二级菜单点击显示当前内容效果
Apr 28 Javascript
微信小程序实现星级评分和展示
Jul 05 Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 Javascript
JS面试题大坑之隐式类型转换实例代码
Oct 14 #Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 #Javascript
详解ES6 Symbol 的用途
Oct 14 #Javascript
javascript实现文本框标签验证的实例代码
Oct 14 #Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 14 #Javascript
单页面vue引入百度统计的使用方法示例详解
Oct 13 #Javascript
详解解决Vue相同路由参数不同不会刷新的问题
Oct 12 #Javascript
You might like
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python使用scrapy解析js示例
2014/01/23 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python 爬取疫情数据的源码
2020/02/09 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python socket处理client连接过程解析
2020/03/18 Python
python设置表格边框的具体方法
2020/07/17 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
文明教师事迹材料
2014/01/16 职场文书
社团招新策划书
2014/02/04 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
政协工作总结2015
2015/05/20 职场文书
Golang bufio详细讲解
2022/04/21 Golang