当前位置: 首页 > news >正文

JavaScript类型识别

类型系统

搬运自个人博客,原址JavaScript类型识别
javascript 类型系统可以分为标准类型和对象类型,进一步标准类型又可以分为原始类型和引用类型,而对象类型又可以分为内置对象类型、普通对象类型、自定义对象类型。

js类型系统

类型转化表

ValueBooleanNumberString
undefinedfalseNaN"undefined"
nullfalse0"null"
truetrue1"true"
falsefalse0"false"
''false0''
'123'true123'123'
'1a'trueNaN'1a'
0false0"0"
1true1"1"
InfinitytrueInfinity"Infinity"
NaNfalseNaN'NaN'
{}trueNaN"[object Object]"

类型判断

  • typeof

  • instanceof

  • Object.prototype.toString

  • constructor

typeof

  1. 可以识别标准类型(null除外)

  2. 不可识别具体的对象类型(Function除外)

例:

//1. 可以识别标准类型(`null`除外)
typeof(1);//"number"
typeof("");//"string"
typeof(undefined);//"undefined"
typeof(true);//"boolean"
typeof(null);//"object"

//2. 不可识别具体的对象类型(`Function`除外)
typeof([]);//"object"
typeof({});//"object"
typeof(function(){});//"function"

instanceof

instanceof左侧为查询变量,右侧为标识对象的类

  1. 能够判别内置对象类型

  2. 不能判别原始类型

  3. 能够判别自定义类型
    例:

//1. 能够判别内置对象类型
[] instanceof Array;//true
/\d/ instanceof RegExp;//true

//2. 不能判别原始类型
1 instanceof Number;//false
"xiaohong" instanceof String;//false

//3. 能够判别自定义类型
function Point(x, y) {
    this.x = x;
    this.y = y;
}
var c = new Point(2,3);

c instanceof Point;//true

Object.prototype.toString.call()方法

  1. 可以识别标准类型,及内置对象类型

  2. 不能识别自定义类型
    例:

//1. 可以识别标准类型,及内置对象类型
Object.prototype.toString.call(21);//"[object Number]"
Object.prototype.toString.call([]);//"[object Array]"
Object.prototype.toString.call(/[A-Z]/);//"[object RegExp]"

//2. 不能识别自定义类型
function Point(x, y) {
    this.x = x;
    this.y = y;
}

var c = new Point(2,3);//c instanceof Point;//true
Object.prototype.toString.call(c);//"[object Object]"
  • 为了方便使用,使用函数封装如下:

function typeProto(obj) {
    return Object.prototype.toString.call(obj).slice(8,-1);
}

typeProto("guo");//"String"
typeProto({});//"Object"

constructor

constructor指向构造这个对象的构造函数本身..

  1. 可识别原始类型

  2. 可识别内置对象类型

  3. 可识别自定义类型
    例:

//1. 可识别原始类型
"guo".constructor === String;//true
(1).constructor === Number;//true
true.constructor === Boolean;//true
({}).constructor === Object;//true

//2. 可识别内置对象类型
new Date().constructor === Date;//true
[].constructor === Array;//true

//3. 可识别自定义类型
function People(x, y) {
    this.x = x;
    this.y = y;
}
var c = new People(2,3);
c.constructor===People;//true
  • 为了方便使用,使用函数封装如下:

function getConstructorName(obj) {
    return obj && obj.constructor && obj.constructor.toString().match(/function\s*([^(]*)/)[1];
}

getConstructorName(new Date());//"Date"
getConstructorName(null);//null
getConstructorName(12);//"Number"

类型判断对比表

  • 其中红色的单元格表示该判断方式不支持的类型。

类型判断对比表

参考:

  • 网易云课堂:面向对象软件开发实践之专业技能训练

  • 网易云课堂前端微专业笔记

相关文章:

  • 前端页面跳转的6大类方法及其使用场景特性分析
  • [saiku] olap数据源管理
  • uniapp开发:瀑布流 灵活配置 简单易用 兼容vue2vue3小程序、H5、app等多端
  • Chrome浏览器使用Overrides调试线上代码的技巧
  • js查找json数据中的最大值和最小值方法集结
  • CSS3 Border-color
  • uniapp+unicloud开发微信小程序流程
  • 微信小程序解决saveImageToPhotosAlbum:fail invalid file type
  • Cacti 不出图像的解决办法(完整版)
  • 我的CSDN博客、UNI技术成长之路
  • websoket封装版 参数配置化 开箱即用
  • h5页面js监听页面失去焦点、获取焦点
  • uniapp之vuex在vue2和vue3两种模式下前端工程化动态导入文件
  • css实现三角形的最简单方式原理剖析
  • android4.4.2内核移植3.4.1
  • 【译】JS基础算法脚本:字符串结尾
  • #Java异常处理
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • create-react-app项目添加less配置
  • Flex布局到底解决了什么问题
  • php的插入排序,通过双层for循环
  • Vue官网教程学习过程中值得记录的一些事情
  • Yii源码解读-服务定位器(Service Locator)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 关于for循环的简单归纳
  • ------- 计算机网络基础
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊hikari连接池的leakDetectionThreshold
  • 思维导图—你不知道的JavaScript中卷
  • 网页视频流m3u8/ts视频下载
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个项目push到多个远程Git仓库
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 《码出高效》学习笔记与书中错误记录
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Java性能优化之JVM GC(垃圾回收机制)
  • 积累各种好的链接
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 T2 联合权值
  • #微信小程序(布局、渲染层基础知识)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (solr系列:一)使用tomcat部署solr服务
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)linux使用docker容器运行mysql
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (三)uboot源码分析
  • (小白学Java)Java简介和基本配置
  • (原)Matlab的svmtrain和svmclassify
  • (转)ABI是什么