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使用prototype定义对象类型
Feb 07 Javascript
javascript 字符串连接的性能问题(多浏览器)
Nov 18 Javascript
javascript权威指南 学习笔记之null和undefined
Sep 25 Javascript
javascript中对Date类型的常用操作小结
May 19 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
Jun 09 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
JavaScript中严格判断NaN的方法
Feb 16 Javascript
JS表单传值和URL编码转换
Mar 03 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
javascript实现拖拽碰撞检测
Mar 12 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
如何去掉文章里的 html 语法
2006/10/09 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
原生js调用json方法总结
2018/02/22 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
快速入门python学习笔记
2017/12/06 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
辞职信标准格式
2015/02/27 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
python中os.path.join()函数实例用法
2021/05/26 Python
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL