虽然目前已经算是ES6的时代,然是ES5的尾巴仍在众多框架中出现,JS我虽然经过视频等方式学习,曾经作过项目,可是仍对部分细节和原理不了解,经过阅读这本书,但愿能对ES5有更加完整的了解。git
数据类型相信对JS有所了解的人都不陌生,可是具体的细节我仍是想作好笔记,方便复查,有时候,这种细节问题出bug你要是不知道是根本没法排除的。另外,面试的时候极可能遇到。github
ES5中有5中简单数据类型,Undefined, Null, Boolean, Number, String.面试
一种特殊的数据类型,只有一个值undefined。框架
var message; alert(message==undefined); // true
已经声明可是没有初始化的变量默认都是Undefined类型的。可是须要强调的是,Undefined类型的默认是在已经声明的前提下,未声明的变量是直接报错而并不是Undefined。函数
var message; // var news; // news未声明 alert(message==undefined); // true alert(news==undefined); // 报错
Null类型一样很特殊,只有一种值,那就是null,他更像是一个空指针,因此其typeof会显示为object类型。另外,当不清楚变量的初始值时,将变量初始为null更加合适,这样一来,只要直接检查 null 值就能够知道相应的变量是否已经保存了一个对象的引用。组件化
if (car!=null){ // some possible operation }
还须要注意的是,Null类型和Undefined类型的相等操做符运算返回值为“true”。学习
布尔型只有两个值,true和false,他不是简单的1和0的对应关系,而是真假,可是,简便地,数据类型的转换会十分灵活,以下面所示。spa
数据类型 | 转换为True | 转换为False |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非0数值,包括无穷大 | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
Number类型还能细分整数和浮点数值。指针
// 整数 var intNum=55; // 八进制 var octalNum1=070; var octalNum2=079; var octalNum3=08; // 十六进制 var hexNum1=0xA; var hexNum2=0x1f; // 浮点数 var floatNum1=1.1; var floatNum2=10.; // 会解析为整数 var floatNum3=3.14e10; // 科学计数法
js在计算中存在精度问题的内容我单独写一篇文章解释,是解决JS浮点数精度问题。因为精度问题的复杂性,本身变成解决成本过高,有人已经组件化实现了。Big.jscode
计算机中的数值是存在范围的,最小值精度表示为Number.MIN_VALUE
,值为5e-325,最大值表示为Number.MAX_VALUE
,值为1.7976931348623157e+308。超过最大值会被解析为Infinity
,小于最小值精度-Infinity
。
NaN是最特殊的类型,表示没有意义的数,例如10/0。并且有下面的特殊规则。
alert(NaN == NaN); //false alert(isNaN(NaN)); //true alert(isNaN(10)); //false( 10 是一个数值) alert(isNaN("10")); //false(能够被转换成数值 10) alert(isNaN("blue")); //true(不能转换成数值) alert(isNaN(true)); //false(能够被转换成数值 1)
数值转换成其余类型规则和案例以下:
若是是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
若是是数字值,只是简单的传入和返回。
若是是 null 值,返回 0。
若是是 undefined,返回 NaN。
若是是字符串,遵循下列规则:
若是字符串中只包含数字(包括前面带正号或负号的状况),则将其转换为十进制数值,即"1"
会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
若是字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(一样,也会忽略前导零);
若是字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
若是字符串是空的(不包含任何字符),则将其转换为 0;
若是字符串中包含除上述格式以外的字符,则将其转换为 NaN。
若是是对象,则调用对象的 valueOf()方法,而后依照前面的规则转换返回的值。若是转换的结果是 NaN,则调用对象的toString()方法,而后再次依照前面的规则转换返回的字符串值。
var num1 = Number("Hello world!"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
因为Number()比较复杂,处理整数的时候parseInt()函数,规则不用多说,直接看例子。
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10(十六进制数) var num4 = parseInt(22.5); // 22 var num5 = parseInt("070"); // 56(八进制数) var num6 = parseInt("70"); // 70(十进制数) var num7 = parseInt("0xf"); // 15(十六进制数)
对于部分状况,ES3和ES5存在分歧。
//ECMAScript 3 认为是 56(八进制), ECMAScript 5 认为是 70(十进制) var num = parseInt("070"); alert(num)
为了防止上述问题,这个函数有了双参数形式。双参数形式的主要目的实际上是规定解析的进制。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN var num1 = parseInt("10", 2); //2 (按二进制解析) var num2 = parseInt("10", 8); //8 (按八进制解析) var num3 = parseInt("10", 10); //10 (按十进制解析) var num4 = parseInt("10", 16); //16 (按十六进制解析)
相似地,还有parseFloat()函数。下面是详细的例子。主要是要看清楚其解析机制。
var num1 = parseFloat("1234blue"); //1234 (整数) var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000
字符串相信都比较熟悉,此处首先是先强调一点,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()函数,若是是数字型,还能够添加参数,使之变为二进制、八进制、十进制、十六进制数。
var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12" alert(num.toString(10)); // "10" alert(num.toString(16)); // "a"
而对其余类型,存在一些特殊状况:
var value1 = 10; var value2 = true; var value3 = null; var value4; alert(String(value1)); // "10" alert(String(value2)); // "true" alert(String(value3)); // "null" alert(String(value4)); // "undefined"
object一样属于一种数据类型,可是属于复杂数据类型,在这本书里面专门有专题讲解,此处先不赘述。
下面是个人我的公众号,技术方面的内容以及非技术方面内容都会在此展现。