查看原文
其他

【JS. ES5重点笔记】数据类型

叉烧ZBayes CS的陋室 2022-08-08

这篇文章在我的Segmentfault中已经发布,感谢朋友的建议,统一我的艺名哈哈。现在链接改为这样:

https://segmentfault.com/u/jizhidechashao

虽然目前已经算是ES6的时代,然是ES5的尾巴仍在众多框架中出现,JS我虽然通过视频等方式学习,曾经做过项目,但是仍对部分细节和原理不了解,通过阅读这本书,希望能对ES5有更加完整的了解。

为什么要选择这个专题

数据类型相信对JS有所了解的人都不陌生,但是具体的细节我还是想做好笔记,方便复查,有时候,这种细节问题出bug你要是不知道是根本无法排除的。另外,面试的时候很可能遇到。

数据类型

简单数据类型

ES5中有5中简单数据类型,Undefined, Null, Boolean, Number, String.

Undefined类型

一种特殊的数据类型,只有一个值undefined。

已经声明但是没有初始化的变量默认都是Undefined类型的。但是需要强调的是,Undefined类型的默认是在已经声明的前提下,未声明的变量是直接报错而并非Undefined。

Null类型

Null类型同样很特殊,只有一种值,那就是null,他更像是一个空指针,所以其typeof会显示为object类型。另外,当不清楚变量的初始值时,将变量初始为null更加合适,这样一来,只要直接检查 null 值就可以知道相应的变量是否已经保存了一个对象的引用。

还需要注意的是,Null类型和Undefined类型的相等操作符运算返回值为“true”。

Boolean类型

布尔型只有两个值,true和false,他不是简单的1和0的对应关系,而是真假,但是,简便地,数据类型的转换会十分灵活,如下面所示。

数据类型转换为True转换为False
Booleantruefalse
String任何非空字符串空字符串
Number任何非0数值,包括无穷大0和NaN
Object任何对象null
Undefinedn/aundefined

Number类型

Number类型还能细分整数和浮点数值。

js在计算中存在精度问题的内容我单独写一篇文章解释,点击这里传送。由于精度问题的复杂性,自己变成解决成本太高,有人已经组件化实现了。链接是这个:

https://github.com/MikeMcl/big.js/

计算机中的数值是存在范围的,最小值精度表示为Number.MIN_VALUE,值为5e-325,最大值表示为Number.MAX_VALUE,值为1.7976931348623157e+308。超过最大值会被解析为Infinity,小于最小值精度-Infinity

NaN是最特殊的类型,表示没有意义的数,例如10/0。而且有下面的特殊规则。

数值转换成其他类型规则和案例如下:

  • 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。

  • 如果是数字值,只是简单的传入和返回。

  • 如果是 null 值,返回 0。

  • 如果是 undefined,返回 NaN。

  • 如果是字符串,遵循下列规则:

    • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"

    • 会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);

    • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

    • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;

    • 如果字符串是空的(不包含任何字符),则将其转换为 0;

    • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。

  • 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

由于Number()比较复杂,处理整数的时候parseInt()函数,规则不用多说,直接看例子。

对于部分情况,ES3和ES5存在分歧。

为了防止上述问题,这个函数有了双参数形式。双参数形式的主要目的其实是规定解析的进制。

类似地,还有parseFloat()函数。下面是详细的例子。主要是要看清楚其解析机制。

String类型

字符串相信都比较熟悉,此处首先是先强调一点,JS对单双引号括起来的字符串没有区别,但是必须匹配。

下面是常见的转义字符:

转义字符含 义
n换行
t制表
b空格
r回车
f进纸
\\斜杠
\'单引号('),在用单引号表示的字符串中使用。例如: 'He said, 'hey.''
\"双引号("),在用双引号表示的字符串中使用。例如: "He said, "hey.""
xnn以十六进制代码nn表示的一个字符(其中n为0~F)。例如, x41表示"A"
unnnn以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如, u03a3表示希腊字符Σ

关于字符串的转换,其实核心就是toString()函数,如果是数字型,还可以添加参数,使之变为二进制、八进制、十进制、十六进制数。

而对其他类型,存在一些特殊情况:

Object类型

object同样属于一种数据类型,但是属于复杂数据类型,在这本书里面专门有专题讲解,此处先不展开讲。

阅读原文内有我在Segmentfault的原文链接。


微信:zgr950123
QQ:545281848欢迎关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存