Javascript高级编程学习笔记(3)—— JS中的数据类型(1)
前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列。
文章中有什么不足之处,还望各位大佬指出。
JS中的数据类型
上一篇中我写了有关JS引入的Script标签相关的东西。
那么这一篇,我们可以正式进入JS的世界了,emmm
前面的东西应该比较基础,大佬们不喜勿喷。
首先学习一门语言,最开始不出意外的话应该是先了解这门语言由什么类型的数据组成,毕竟语言都是建立在这些数据类型的基础之上的。
在介绍数据类型之前,我先大概说一下 typeof 操作符,这是JS中判断一个变量的数据类型的操作符,它的返回值是一个数据类型的字符串。
下面我将先例举一下,typeof 的一些值的说明,以免大家对后面的内容产生疑问。
1. typeof null === “object” 在JS中NULL被认为是空对象的引用,所以 typeof null 的值为“object”
2. 在一些低版本浏览器中,typeof 对正则表达式的结果为“function” ,其它情况下对正则表达式使用 typeof 的返回值为“object”
3.对未声明的变量使用 typeof 的返回值为 “undefined”
4.对未初始化的变量使用 typeof 的返回值为 “undefined”
PS. 若使用未声明的变量浏览器会报错,但是如果对未声明的变量使用 typeof 浏览器不会报错,并且会返回“undefined”
对于第三点和第四点,为了将未声明,和未初始化加以区别,所以我们最好在声明变量时显示地初始化变量,这样就能通过 typeof 来判断一个变量到底是未声明,还是未初始化
下面正式开始介绍。。。
Undefined类型
该类型只有一个值 那就是 undefined
未经初始化的变量会默认取得该值
对于undefined类型,需要注意的就是,不要显式地将变量初始化为undefined,这样你就不能判断这个变量是否已经声明。
原因在上方,已做出说明
var a = undefiend;
即对于undefined不推荐上方的这种使用方式。
这一类型的主要作用是用于比较,即判断数据的合法性,是这一类型最常见的作用
Null类型
这一类型与Undefined类型一样,都只有一个值,那就是null
与undefined的区别在于,typeof 对于null 的返回值并不是 “null” 而是 “object”,因为null 在JS的逻辑中,通常代表一个空对象。
而null本身代表的也是一个指向空对象的指针,所以typeof的返回值为“object”
除此而外,有一个需要注意的地方就是,undefined派生自null,所以在ECMA-262的标准中,规定对于两者的相等性测试应该返回 true
即,如下图所示
这里的相等,是指 == (相等操作符)因为相等操作符要遵守的规则中,做出规定 undefined等于null(其余规则将在后面的文章中提到)
而对于全等操作符 === 虽然 undefined和null被规定为值相等,但是两者的类型不同,一个是Undefined类型,另一个是Null类型,所以全等操作符的返回值为false
并且与Undefined不同的是,JS中推荐将一切用于报存对象的变量初始化为null,因为这样做不仅能体现null是一个指向空对象的指针,还能对undefined加以区分
Boolean类型
该类型只有两个值,ture、false。
要注意的是Boolean的true和false与数字的0和1没有必然联系
如果说二者有什么联系的话,那么只能是两者经过类型转换后的值相等
这里全等和相等的具体区别在后面的文章中会有所介绍
需要注意的是true和false是区分大小写的,比如True代表的就是一个普通的变量,而true代表的就是boolean中的一个值
虽然boolean类型只有两个值,但是其它所有的类型都有与Boolean值等价的值
可以通过Boolean()转型函数将其它类型的值转换为boolean
转换规则如下:
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任意非空字符串 “”(空字符串)
Number 任何非零值包括无穷 0和NaN
Object 任何对象 无
Undefined 无 undefined
Null 无 null
以上规则对于流控制语句同样适用
因为 if 等流控制语句会自动执行Boolean类型转换
Number类型
该类型使用IEEE754格式(二进制浮点数运算标准)来表示整数和浮点数值。
在此基础上JS定义了不同数值字面量的格式
整数值
十进制:
默认的数值类型
var a = 55;
八进制:
第一位必须为0,后面为八进制数据序列(0~7)
若超出范围JS将忽略前导零,将后面的数字当作十进制解析
需要注意的是八进制在严格模式下是无效的,支持的JS引擎会抛出错误
十六进制:
以0x开头(a~f 可大写可小写),对于超出范围的值js会抛出错误
在进行运算时,八进制和十六进制最终都将被转为十进制,就如上面两张图所示
PS 鉴于JS中数值保存的方式可以保存 +0 -0 两者被认为相等
浮点数值
对于浮点数值,即该数值中包含一个小数点,并且小数点后至少有一位数字。
虽然小数点前面可以没有整数,但不推荐这种写法 如:.4
在此基础上由于保存小数所需要的空间是保存整数值的两倍,因此如果小数点后没有数字,或者该小数表示的就是一个整数(1.000)JS会将该值转为整数
对于极大或极小的数可以使用科学技术法来表示,即
3.15e7
所表示的值为3.15*10^7
在默认情况下,JS会将小数点后带有6个0以上的浮点数值转为科学记数法表示
除此而外,浮点数的精度为17位小数,但是计算时的准确度远不如整数
比如大名鼎鼎的0.1加0.2的问题
这是IEEE754的通病,并非JS特有,只要使用该标准的语言都会有这样的舍入误差
所以我们不能测试特定的浮点数数值,不然很可能会出现问题
如 if(a+b===0.3)
数值范围
JS所能保存的最小数值保存在Number.MIN_VALUE 中大多数浏览器中,该值为5e-324
最大值保存在Number.MAX_VALUE中 大多数浏览器中该值为 1.7976931348623157e+308
超出这个范围就会转为Infinity,该值无法用于计算,如果计算的值返回了Infinity那么将不能参与下一次的运算
如果Infinity参与了运算,具体情况视操作符而定,后面的文章会讲到
判断一个值是否为Infinity,可以使用isFinite()函数进行判断
NaN
这中类型是一个特殊的值,(Not a Number)即’不是一个数字‘
用于表示,本来要返回一个数值,但返回的不是一个数值的情况,这样就可以避免抛出错误了,从而避免影响代码的运行。
NaN有两个特点,首先任何涉及NaN的操作都会返回NaN
其次,NaN与任何值都不相等,包括NaN本身
为了判断NaN这一值,JS提供了isNaN()函数,
该函数接收任何值,函数会尝试将该值转为数值,任何不能转为数值的值都会返回true
关于对对象的转换,跟Number()方法的规则一致
下方将会介绍
数值转换
有三个方法可以将非数值转换为数值
Number()可用于任意数据类型
parseInt()专用于字符串转数值
parseFloat()专用于字符串转数值
Number():
对于Boolean类型 true 转为 1 ,false 转为 0
对于Number类型 仅仅是值的传入和传出,不做处理
对于Null类型 返回0
对于Undefined类型 返回NaN
对于String类型 :
1.只包含数字,将其转为十进制数值,忽略前导零
2.包含有效的浮点数格式,将其转为浮点数,同样会忽略前导零
3.包含有效的十六进制的格式,转为十进制数字
4.空字符串转为 0
5.不是上述中的任意一种转为NaN
对于Object类型:
首先调用对象的Valueof()方法,若其返回值按照上方的规则可以转为数字,那么返回转换后的数字(包括NaN),如不能返回数字则调用值的toString()进行转换,规则同上,若仍不能转为数字则报错,能转换则返回转换后的数字(包括NaN)
例子如下:
我们在看一下如果将toString’改为返回一个对象看看是否会报错
该报错的大概意思为,不能将该对象转换为原始数据类型
parseInt()
由于Number()的处理较为复杂且有些不合理,所以将字符串转为整数时最好使用parseInt()
转换规则如下:
1.若第一个字符不是数字或者正负号则返回NaN
2.若满足1则继续解析下一个字符,直到不为数字为止,然后以这一部分数字作为十进制的值返回
如 “123lhy” 则返回123
除此而外,该函数还能够解析八进制和16进制,对于八进制由于会产生歧义,所以最好使用第二个参数,来设置转换使用的基数,即使用多少进制
Number.parseInt('123',16);
parseFloat()
解析规则与parseInt()类似
遇到第一个无效的浮点数位停止
需要注意的地方在于该方法只解析十进制数,也不提供第二个参数设置基数
除此而外如果数值可以解析为整数,那么会返回一个整数
由于时间的限制,今天先介绍这四种类型,明天介绍剩下的String类型以及Object类型
Javascript高级编程学习笔记(3)—— JS中的数据类型(1)的更多相关文章
- Javascript高级编程学习笔记(4)—— JS中的数据类型(2)
接着昨天的文章,今天这篇文章主要讲述JS中剩余的两种数据类型String,和Object String类型 对于该类型,书中给出的解释为:由0或多个16为Unicode字符组成的字符序列. 对于JS中 ...
- Javascript高级编程学习笔记(5)—— JS操作符
话不多说,开始今天的码字之旅. 突然有种日更小说的感觉,emm... 操作符 ECMAScript(JS核心)描述了一组用于操作数据值的操作符,也包括算术操作符等等 而JS中这些操作符最鲜明的特点就是 ...
- Javascript高级编程学习笔记(43)—— 动态脚本
动态脚本 大多数情况下,DOM操作都很简洁明了 因为DOM主要就是用来操作页面中的可视节点的 但有些时候我们又希望可以动态的来进行DOM操作 其中的一部分也就是今天我们的内容动态脚本 动态脚本是什么意 ...
- Javascript高级编程学习笔记(35)—— DOM(1)节点
DOM JS由三部分组成 1.BOM 2.DOM 3.ECMAScript ES和BOM在前面的文章已经介绍过了 今天开始JS组成的最后一部分DOM(文档对象模型) 我们知道,JS中的这三个部分实际上 ...
- Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域
昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...
- Javascript高级编程学习笔记(23)—— 函数表达式(1)递归
前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...
- Javascript高级编程学习笔记(18)—— 引用类型(7)单体内置对象
什么是内置对象呢? js高级程序设计中给出的定义为:由ES规定不依赖于宿主环境的对象,这些对象在JS执行前就已经存在 前面我们介绍的引用类型都是内置对象 除了这些对象外ECMA还规定了两个单体内置对象 ...
- Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型
JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...
- Javascript高级编程学习笔记(10)—— 作用域、作用域链
昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...
随机推荐
- Http协议和Https协议的安全性问题
https://www.cnblogs.com/intsmaze/p/6009648.html https://blog.csdn.net/jeffleo/article/details/768630 ...
- ZigBee相关网站链接
1.Arduino开源智能家居<认识Zigbee>zigbee功能和自组网介绍-Arduino中文社区 2.小米智能家庭套装为什么选择 ZigBee 协议?|极客公园 3.晓网智能家居Zi ...
- hadoop分布式集群搭建(2.9.1)
1.环境 操作系统:ubuntu16 jdk:1.8 hadoop:2.9.1 机器:3台,master:192.168.199.88,node1:192.168.199.89,node2:192.1 ...
- HTML DOM学习
本文档参考菜鸟教程:http://www.runoob.com/htmldom/htmldom-tutorial.html 前提: DOM Document Object Model(文档对象模型) ...
- Echarts 柱状图属性详解
<script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init ...
- ASP.NET Boilerplate-AbpSession
/------2016-05-15/------介绍 如果一个应用支持登录,也许需要知道当前登录用户的一些操作,然而ASP.NET 本身对于展现层提供了Session的支持,ABP提供了 IAbpSe ...
- java中的throw、throws和try catch浅析
今天在公司和同事聊天的时候,突然发现自己对java中的throw.throws和try catch的作用理解不够准确,在网上查了查,在此大概梳理一下. throw用于抛出异常,例如 throw new ...
- sonar gitlab+jenkins配置
sonar.projectKey=test-news-activitysonar.projectName=test-news-activitysonar.projectVersion=$BUILD_N ...
- 用rekit创建react项目
第一步 先进入github.com 然后搜索rekit 往下滑 1 . 先全局安装 npm install -g rekit 2 . 进入自己想要创建项目文件的目录输入 rekit create / ...
- swift 分组tableview 设置分区投或者尾部,隐藏默认间隔高度
1.隐藏尾部或者头部,配套使用 //注册头部id tv.register(JYWithdrawalRecordSectionView.self, forHeaderFooterViewReuseIde ...