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

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

为何我要选择这个作专题

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

数据类型

简单数据类型

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

Undefined类型

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

var message;
alert(message==undefined);  // true

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

var message;

// var news; 
// news未声明

alert(message==undefined);  // true
alert(news==undefined);     // 报错

Null类型

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

if (car!=null){
    // some possible operation
}

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

Boolean类型

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

数据类型 转换为True 转换为False
Boolean true false
String 任何非空字符串 空字符串
Number 任何非0数值,包括无穷大 0和NaN
Object 任何对象 null
Undefined n/a undefined

Number类型

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

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()函数,若是是数字型,还能够添加参数,使之变为二进制、八进制、十进制、十六进制数。

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类型

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

下面是个人我的公众号,技术方面的内容以及非技术方面内容都会在此展现。
我的公众号

相关文章
相关标签/搜索