在ECMAScript中,规定有5种简单的数据类型(也称为基本数据类型)即:Number、String、Boolean、Undefinded和Null;还有一种复杂数据类型:Object;
一:关于数据类型
Number:数字
从 正无穷 到 负无穷 包含整数和浮点数,这涵盖我们日常生活中认知的数字类型;在编程语言中被定义了一个特殊的Number数据类型-NaN(not a number)用于处理计算中出现错误的情况。如它的身世,它的特性也是比较有意思,他自个儿都不等于子个儿!那么我们该如何判断某个Number的值是否为NaN呢?非常感谢标准给我们提供了一条函数isNaN(),当返回结果为true是,该Number的值为NaN;当然还有一些土办法,比如:
var nub1 = NaN;
console.log(nub1 == nub1);
拿它与自身做对比,当发现返回结果为false时(即不相等),那它就是NaN啦。
String:字符串
有零或多个16位Unicode字符组成的字符序列,即字符串;字符串需要有引号包起来,单引号(')或双引号(")都是合法的,但必须成对出现;
Boolean:布尔值
该类型就两个值true和false;常用于逻辑运算。
Undefinded
该类型就一个值,即特殊的undefinded。在使用var声明变量但为初始化值时,这个变量的值就是undefined。如:
var x;
console.log(x);
返回结果为undefined;
null
这是第二个只有一个值的数据类型。这个特殊的值是null。从逻辑角度来看,null空的对象指针。
Object:对象
ECMAScript中的对象就是一组数据和功能的集合。
二:关于数据类型的转换
由于数据类型具有动态性,当我们获取到的数据,需要进行操作而需求的数据类型不一致时,我们可以使用数据类型转换的方式完成目标操作。举个简单的例子,当我们需要比较“20元”的面额和“50元”的面额哪个比较大的时候?作为一个土生土长的中国人,你可能不需要运用数学知识,直接通过生活经验就能给出答案。但计算机不行,他没有生活。他唯一能做的就是通过数学运算。在他看来就是"20<50",但你的“元”是什么意思,会影响我的判定吗?为此他可能犹豫不决,甚至直接返回不知道。那么这时候我们就需要通过数据类型转换,将“20元”与“50元”映射到同一个集合,只需要计算机比较它们在这个集合中的数值大小,那么这个问题就迎刃而解了。当然,数据类型转换的应用场景很多,灵活运用对于解决开发遇到的问题有很大的帮助。
简单来讲,数据类型转换有两种形式;一种是强制类型转换(显性数据转换);做强制类型转换最简单的方法就是使用Boolean()、Number()、String()、或object()函数;另一种是在对数据进行一系列操作时,数据类型按照某种规律有系统自动转换,称之为隐式数据类型转换。
为了更直观了解到数据类型,我们可以通过一个操作符typeof(),来查看我们的数据类型。便于我们判断数据类型转换的方向。
在这里我们需要做一个小的笔记,typeof()监测出的数据类型,和ECMAScript的划分有一些小小的差异,在typeof()的结果中,数据类型划分为:Number、String、Boolean、Function、Undefinded和Object ;
1.强制类型转换
parseInt:解析成整型;
(function () {
var s1 = '123';
var s2 = 'a123';
var s3 = '0x123';
var s4 = '123.5';
var n1 = 123;
var n2 = 123.9;
var b1 = true;
var b2 = false;
var fn = function(){};
var obj = {"n":1};
var arr1 = [];
var arr2 = ['0.13'];
console.log(parseInt(s1))
console.log(parseInt(s2))
console.log(parseInt(s3))
console.log(parseInt(s4))
console.log(parseInt(b1))
console.log(parseInt(b2))
console.log(parseInt(fn))
console.log(parseInt(obj))
console.log(parseInt(arr1))
console.log(parseInt(arr2))
console.log(parseInt(n2))
})()
从上面的例子中,我们可以 查看到返回结果依次为:
123、NaN、291、123、NaN、NaN、NaN、NaN、NaN、0、123
可以看到返回结果非NaN的就parseInt(s1)、parseInt(s3)、parseInt(s4)、parseInt(arr2)、console.log(parseInt(n2))
也就是说,除本身就是数字外,只有某些字符串或者数组才能通过parseInt()来进行数据类型转换;
那么简单总结下parseInt()的数据转换规则:
对于数组或者字符串,从第0位开始,依次查看是否是数字,如果到某一位不是数字,就把这位之前的数字提取出来;如果第0位就不是数字,直接返回NaN;当然,字符串中的小数点不会被解析,而是直接返回小数点之前的结果;
如果要转换的数据是以0x开头,会被解析成十六进制;如果这并不是我们想要的,可以使用parseInt的第二个关于进制的参数来控制解析如:parseInt(s3,10);返回结果当然只会是0;
parseFloat:解析成浮点型
解析规则和parseInt一样,不一样的是,可以解析一个小数点。
比如,按照上面的数据我们取:
console.log(parseFloat(s1))
console.log(parseFloat(s3,10))
console.log(parseFloat(s4))
console.log(parseFloat(arr2))
返回的结果依次为:
123、0、123.5、0.13
Number:解析成数字;
按照以上的数据,依次进行转换成数字类型Number()的计算;
我们发现只有:
console.log(Number(s1))
console.log(Number(s2))
console.log(Number(s3))
console.log(Number(s4))
console.log(Number(n2))
console.log(Number(b1))
console.log(Number(b2))
才能返回数字类型
在进行数字转换时,完整把要转换的内容看一遍,必须完全符合数字规范才去进行转换,否则返回NaN;
在对Boolean值进行转换时,true是1;false是0;
在对空字符串进行转换时,返回的是0;
在对null进行转换时,返回0;
在对undefined进行转换时,返回NaN;
对数组进行转换,空数组返回0;当数组的length只有一位时,就去转换这一位,这一位是数字、字符串或者null才会按照如上规则进行转换,否则返回NaN;当数组的length不止一位时返回NaN;
String:转换成字符串
console.log(String(n1))
console.log(String(n2))
console.log(String(b1))
console.log(String(n2))
console.log(String(b2))
console.log(String(fn))
console.log(String(obj))
console.log(String(arr1))
console.log(String(arr2))
相当于对转换内容左右两边加个“引号”;
Boolean:转换成布尔值;
true:非0的数字、非空字符串、函数、非空对象、数组(空数组不是空对象)
false:0、NaN、空字符串、undefined、null(空对象)
2.隐式类型转换
同样,我们援引上面的例子,比较20元和五十元面额谁大谁小的情况。按照常规,我们需要先把手动进行数据类型转换(强制数据类型转换)之后得到的数字交由电脑来进行比较。可不可以让它自己来解决这个问题呢?
直观来讲,不能~!但某些条件下,它是也是可以按照规则自动进行类型转换的。比如:
==、!=、>、<、>=、<=
当我们执行逻辑运算时:
当两边都是number,比较number大小
当两边都是string,比较编码大小
当两边都是boolean,比较true与false
当一边number,一边其他类型,转换成number比较
任意number 与 NaN作比较都返回false ;
===、!==
当然,这两是个例外。它不会去对数据类型转换之后再来进行逻辑运算。而是首先对数据类型进行判断,当运算符两边的值类型不同时,直接返回false;在两边数据类型相同的情况下再比较数字大小或者编码大小。
+、++、+=
- 如果两边都可以转换成数字,就进行数字相加(number)
- 如果不能把左右都转成数字,就执行字符串连接
- 如果有一边为字符串,那就进行字符串拼接
- 对于转换为数字类型不为NaN的一条数据加上not a number时,返回NaN
- string++不等于string+1;返回NaN
- ++不能用于字符串链接
-、*、/、%、--
会把两边都转换成number进行相应运算,只要有一边不能转换为number就返回NaN;