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 相关文章推荐
Web 前端设计模式--Dom重构 提高显示性能
Oct 22 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
May 14 Javascript
JavaScript数据结构和算法之图和图算法
Feb 11 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 Javascript
Vuex提升学习篇
Jan 11 Javascript
JS数组方法reverse()用法实例分析
Jan 18 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 Javascript
vue实现同时设置多个倒计时
May 20 Vue.js
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
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
JS定时器实例
2013/04/17 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python字符串连接方式汇总
2014/08/21 Python
Python实现句子翻译功能
2017/11/14 Python
简单实现python聊天程序
2018/04/01 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
python3安装crypto出错及解决方法
2019/07/30 Python
python中if及if-else如何使用
2020/06/02 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
销售业务员岗位职责
2014/01/29 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
实名检举信范文
2015/03/02 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
angular4实现带搜索的下拉框
2022/03/25 Javascript
Python中request的基本使用解决乱码问题
2022/04/12 Python