请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?
js的8种数据类型
JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引用数据类型object
number
JavaScript中的整数和浮点数都会按照浮点数的标准进行存储.
即64个二进制位, 从最左边开始:
第1位: 符号位, 0表示正数, 1表示负数
第2到第12位: 存储指数部分
第13到第64位: 存储小数部分
其中, 符号位决定一个数是正数还是负数, 指数部分决定了一个数的大小, 小数部分决定了一个数的精度
数值精度
JavaScript提供的有效数字最长为53个二进制位, 这意味着绝对值小于2的53次方的整数都能够精确表示
JavaScript内部实际的表现形式:
(-1)^符号位 * 1.xxx...xxx * 2^指数Math.pow(2, 53) === Math.pow(2, 53) + 1
0.1 + 0.2 = 0.30000000000000004就是因为精度缺失的原因, 还有人因此做了一个网站: (http://0.30000000000000004.com/)
Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER分别表示js的最大安全数和最小安全数
数值范围
指数部分的最大值是2047(2^11 - 1), 分出一半表示负数, 那么JavaScript能够表示的数值范围为2^1024到2^(-1023)
Number.MAX_VALUE和Number.MIN_VALUE代表js可表示的最大数字和最小数字
当一个浮点值大于(小于)js所能表示的最大(最小)值时, 其结果是Infinity(-Infinity), 12/0返回Infinity, -12/0返回-Infinity
NaN
NaN表示not a number(非数字), NaN和任何值都不相等, 包括它自己. 所以x != x当且仅当x是NaN时成立. 0/0会返回NaN
- Number.isNaN(Number.NaN)
- x != x 可以用来检测x是否是NaN
Number.isFinite()可以用来检测Number.NaN和Infinity.
bigint
bigint可以使用任意精度表示整数. 即使超出js的安全数, 也可以安全地存储和使用大整数
bigint不能表示小数
BigInt(123)string
js中的字符串是不可变的, str.length可表示字符串的长度
基本数据类型字符串它不是对象, 却能够使用对象才有的属性和方法进行操作(比如str.length, str.split('-')), 这是因为三个关键的基本数据类型都有自己对应的对象(Number, String和Boolean). 这三个对象是针对数字, 字符串和布尔值的包装.
当我们在对象环境中使用字符串时(比如使用str.length), JavaScript会为这个字符串内部地创建一个String对象, 这个对象就代替了原始的字符串值来执行相应的操作. 注意此时被创建的String对象只是瞬时存在的, 使用之后系统就会自动将其丢弃.boolean
null, undefined, 0, -0, NaN, ''都可以转成false
null和undefined
null == undefined会返回true, null === undefined会返回false
symbol
symbol代表独一无二的值
let s = Symbol(); // 这样就生成了一个唯一不可变的值
let s1 = Symbol('s1'); // 参数表示对symbol值的描述
let s2 = Symbol('s1'); // s1 == s2会返回falselet a1 = Symbol.for('aa');
let a2 = Symbol.for('aa'); // a1 === a2会返回true
- 用symbol作为对象的属性名时, 不能通过点去访问属性, 通过点访问, js会将属性名解析成字符串
- JSON中无法存储Symbol类型的值
不可枚举: 当Symbol值作为对象属性名时, 可以保证对象不会出现重复的属性, for in等方式无法枚举Symbol值出来, 可以调用Object.getOwnPropertySymbols()获取Symbol值. 借助Symbol的不可枚举特性可以在js中模拟私有变量
object
对象是通过调用特殊的构造函数创建的, 常常要使用到的对象有以下:
- function: JavaScript的函数是具有可执行代码的对象, 可以通过调用函数执行某些操作
- array
- class
- Date日期
- RegExp正则表达式
- 匹配所有中文字符, 匹配邮箱
- Math数学
- Math.ceil(), Math.floor()
- Math.round(), Math.random()
- JSON
- null, NaN, Infinity, -Infinity, 正则对象和undefined都会被转成null
- JSON.parse(JSON.stringify())
Error: 程序中发生的语法错误和运行时错误的对象
数据类型判断
typeof
- 对于非object的基本类型, 除null以外, 均可返回意料之中的结果
- 对于引用类型, 除function以外, 一律返回object
- 对于null, 返回object
- 对于function, 返回function
- typeof(typeof a)返回的是string
因为typeof NaN会返回number, 但是NaN不能用于数值计算, 所以在使用typeof判断数字时, 建议这样子做: typeof num == 'number' && Number.isFinite(num)
instanceof
A instanceof B是用来判断B的原型是否在A的原型链上
instanceof的问题在于它假定只有一个全局执行环境, 如果存在两个及以上的全局执行环境, 那么就存在不同的构造函数, 此时instanceof无法进行判断
Object.prototype.toString.call
Object.prototype.toString.call(true) === '[object Boolean]'
constructor
当声明定义一个构造函数时, js会为构造函数添加一个prototype属性指向构造函数的原型对象, 这个原型对象会有一个constructor属性指向构造函数. 而当使用new和构造函数创建一个实例对象时, 实例对象会继承原型对象的constructor属性
let a = [], b = 100;
a.constructor == Array
b.constructor == Number
当程序员重写prototype指向之后, 原来的constructor就会丢失
使用JavaScript写一个判断数据类型的函数
function getType(data) {if(data === null) return 'Type: null';else if(data === undefined) return 'Type: undefined';else if(typeof data == 'number' && Number.isFinite(data)) return 'Type: number';else if(typeof data == 'string') return 'Type: string';else if(typeof data == 'boolean') return 'Type: boolean';else if(typeof data == 'function') return 'Type: function';else {let tmp = Object.prototype.toString.call(data);return 'Type:' + tmp.slice(7, tmp.length-1).toLowerCase();}
}
转载于:https://www.cnblogs.com/lemachin/p/11090684.html
请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?相关推荐
- 达内java晨讲案例_郑州达内的一天之晨讲主题:javascript的DOM
在郑州达内的每一天都是充实的,在郑州达内的每一天都是开心的,在郑州达内每一天都是知足的,因为我们在达内提升的不仅仅是技能,更多的是收获了众多的小伙伴.下面就来看看郑州达内的晨讲吧,学习知识提升口才两不 ...
- 每日一题:讲一讲你理解的微服务架构?
点击上方 ,选择 设为星标 优质文章,及时送达 原文来自 GitHub 开源社区 Doocs,欢迎 Star 此项目,如果你有独到的见解,同样可以参与贡献此项目. 面试题 讲一讲你理解的微服务架构? ...
- 面试:讲一讲Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...
- 经典面试题 | 讲一讲JVM的组成
来源:王磊的博客 JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成. 首先来说 JVM 的组成分 ...
- 经典面试题|讲一讲JVM的组成
JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成. 首先来说 JVM 的组成分为,整体组成部分和 ...
- java面试题jvm_经典面试题|讲一讲JVM的组成
经典面试题|讲一讲JVM的组成 发布时间:2019-04-10 09:01, 浏览次数:1456 , 标签: JVM JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一 ...
- sqlyog怎么查找表_VBA代码解决方案第58讲:在VBA中查找指定工作表的实用方法
大家好,我们今日继续讲解VBA代码解决方案的第58讲内容:在VBA中查找指定工作表的方法.在上一个例子中,我们通过一个自定义函数解决了删除工作表的方法.其实实现目的的方法有很多种,不必要必须有某种办法 ...
- 【小甲鱼】python零基础入门学习笔记 03讲~43讲
本篇基于[莫烦]python基础教程,属于查漏补缺 建议学习顺序 小甲鱼->莫烦numpy&pandas 目录 第003讲 插曲之变量和字符串 课堂笔记 变量 变量 需要注意的地方 字符 ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...
最新文章
- ubuntu中文wiki
- netcore命令行部署|跨域问题
- 运维基础(14)Mysql5.7 里4个数据库
- VS2005 解决应用程序配置不正确,程序无法启动问题
- mysql恢复root用户_恢复MYSQL的root用户
- php 实现的字典序排列算法,字典序的一个生成算法
- cocos2dx 3.0 windows平台 中文乱码解决
- 数据结构与算法之六堆排序
- scrapy爬取某网站,模拟登陆过程中遇到的那些坑
- Android核心模块内容概述
- GetTickCount64的使用
- Unity获得汉字拼音或首字母
- Gantt - attachEvent事件监听 - (必须)拥有返回值事件
- Simulink模型的仿真
- vb.net 教程 3-1 窗体编程基础 2
- 常用的推挽输出、开漏输出、上拉输入
- 视频全屏非全屏切换,状态栏动态显示隐藏兼容性解决
- 智能手表,能否成为苹果的二次革命?
- 以leds-gpio.c为例,浅谈class、bus和platform子系统
- 【excel技巧读书笔记005】快速隔行填充
热门文章
- Fedora17 开启ssh服务
- 【转】Linux添加/删除用户和用户组
- pta段错误怎么办_雅思50问 | 07:雅思写作时间不够怎么办?写不完会给分吗?...
- JSP Problem(第一次创建Web Project报错)
- hive 解密_hive 中自定义 base64 加密 解密 UDF 函数
- 现代微波滤波器结构与设计_高功率射频及微波无源器件中的考虑和限制
- 怎么自定义linux登录界面?
- 小白都能看懂的网络性能测试
- mysql 中文字符查询不出数据_jsp页面显示不出mysql中查询出的中文字符串,插入中文也不好使...
- 图片对服务器性能,关于适用base64对图片进行编码在服务器上性能的相关讨论