详解JavaScript数据类型和判断方法


Posted in Javascript onSeptember 04, 2020

前言

JavaScript 中目前有 7 种基本(原始primitives)数据类型 UndefinedNullBooleanNumberStringBigIntSymbol,以及一种引用类型 ObjectObject 中又包括 FunctionDateJSONRegExp等,除了 7 种原始类型,其他的所有能够用 new 实例化的内置类型都是 Object 构造的。

数据类型

对于数据了类型我们可以通过 typeof 运算符来判断,具体结果看下图。

详解JavaScript数据类型和判断方法

原始类型中两个比较特殊的就是 UndefinedNull,他们两个类型都只有一个值就是 undefinednull

Undefined

undefined 一般表示我们未对变量进行初始化。使用 typeof 操作符的时候,如果是未声明变量,同样也会返回 undefined,再比如未设置返回值的函数执行的结果是 undefined,未设置的参数也会被默认为 undefined。最后还有一点需要注意的是,undefined 并不是 js 的保留字,并且是全局对象的一个属性,在浏览器环境中就是 window.undefined。当在局部环境中,我们是可以自己给 undefined 属性赋值的,也就是重写 undefined,所以为了确保我们使用的 undefined 是未被重写的,我们可以使用 void 0 来代替。

Null

null 可以简单理解为一个未被创建的对象,比如我们使用 document.getElementById 并没有找到对应元素的时候就会返回 nullnullundefined 有一些区别,在转换为 Number 的时候,null 会转换为 0 undefined 会转换为 NaN,执行 typeof 运算的时候,undefined返回 undefinednull 返回 object。使用 == 判断两者相等会返回 true,所以为了防止误判一般我们使用全等 ===null 是所有对象原型链的终点,Object.prototype.__proto__ === null

关于 null 的使用,当我们声明一个变量是用来存储对象我们可以先赋值为 null,当一个对象不再需要的时候,我们可以设置为 null 解除这个引用。

Symbol 和 BigInt

这两个都是 ES6 新增的原始数据类型,Symbol 类型的数据通过 Symbol() 方法的执行产生,不过需要注意的是 Symbol 不能作为构造函数,每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。

而 BigInt 则是为了精确表示超出双精度浮点数的最大安全表示范围的大数而新增的基本数据类型。

判断数据类型的方法

typeof 运算符

最简单的判断数据类型的方法是 typeof 运算符,返回值为字符串。typeof 的缺点是除了 Function 以外的其他所有对象的返回值都是 object (null 的返回值也是 object),如果我们需要区分不同的对象,就无法使用 typeof。

instanceof 运算符

instanceof 运算符是检测构造函数的原型是否出现在某个对象的原型链上。通过 instanceof 运算符我们可以实现对 Object 类型的细分,确定属于哪种对象。但是 instanceof 的缺点是只能对对象进行检测,对于基本数据类型的实例无法检测(字面量无法检测,但是通过基本包装类型的构造函数创建的基本类型可以进行检测)。

constructor 属性

利用实例的 constructor 属性来辅助判断实例的数据类型也是一种手段。一般来说,实例本身是没有 constructor 属性的,我们所看到的属性都是 实例.__proto__.constructor,换言之也就是实例的构造函数,这种方式对基本数据类型也是有效的。这种方法的一个比较大的问题是 constructor 属性是个不受保护的属性,随时可能被更改,我们既可以给实例增加 constructor 属性,也可以修改构造函数的 prototype 的引用,也可以直接修改原型的 constructor 属性。

Object.prototype.toString.call()

这是最安全准确的检测数据类型的方法,每一种数据类型的构造函数的原型上都有 toString 方法,但是除了 Object.prototype上的 toString 是用来返回当前实例所属类的信息(检测数据类型的),其余的都是转换为字符串的。该方法可以准确检测所有内置类型。自定义类型的返回值为 Object Object

let toString = Object.prototype.toString //=>Object.prototype.toString

console.log(toString.call(10)); //=>"[object Number]"
console.log(toString.call(NaN)); //=>"[object Number]"
console.log(toString.call("xxx")); //=>"[object String]"
console.log(toString.call(true)); //=>"[object Boolean]"
console.log(toString.call(null)); //=>"[object Null]"
console.log(toString.call(undefined)); //=>"[object Undefined]"
console.log(toString.call(Symbol())); //=>"[object Symbol]"
console.log(toString.call(BigInt(10))); //=>"[object BigInt]"
console.log(toString.call({xxx:'xxx'})); //=>"[object Object]"
console.log(toString.call([10,20])); //=>"[object Array]"
console.log(toString.call(/^\d+$/)); //=>"[object RegExp]"
console.log(toString.call(function(){})); //=>"[object Function]"

以上就是详解JavaScript数据类型和判断方法的详细内容,更多关于JavaScript数据类型和判断方法的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript 学习笔记(四)
Dec 31 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 Javascript
Javascript中的delete介绍
Sep 02 Javascript
javascript获取选中的文本的方法代码
Oct 30 Javascript
js中typeof的用法汇总
Dec 12 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
Jul 13 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
js的三种继承方式详解
Jan 21 Javascript
vue2.x select2 指令封装详解
Oct 12 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
Sep 04 #Javascript
详解JavaScript中new操作符的解析和实现
Sep 04 #Javascript
我所理解的JavaScript中的this指向
Sep 04 #Javascript
JS运算符优先级与表达式示例详解
Sep 04 #Javascript
vue中的循环对象属性和属性值用法
Sep 04 #Javascript
JavaScript逻辑运算符相关总结
Sep 04 #Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 #Javascript
You might like
php实现session共享的实例方法
2019/09/19 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python获取代码运行时间的实例代码
2018/06/11 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
使用Python封装excel操作指南
2021/01/29 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
药品促销活动方案
2014/02/14 职场文书
购房意向书范本
2014/04/01 职场文书
工作失职检讨书500字
2014/10/17 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
python flask框架快速入门
2021/05/14 Python
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技