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 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
javascript中去除数组重复元素的实现方法【实例】
Apr 12 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
Three.js实现浏览器变动时进行自适应的方法
Sep 26 Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
JavaScript switch语句使用方法简介
Dec 30 Javascript
JS错误处理与调试操作实例分析
Apr 13 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 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快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
PHP多进程简单实例小结
2019/11/09 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
Python常用列表数据结构小结
2014/08/06 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python元组知识点总结
2019/02/18 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
高中体育教学反思
2014/01/24 职场文书
法制报告会主持词
2014/04/02 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
离婚财产处理协议书
2014/09/30 职场文书
通报表扬范文
2015/01/17 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
使用feign服务调用添加Header参数
2021/06/23 Java/Android
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers