由于环境关系,今天下定决心,要在半年之内,让自己的技术水平有一个很大的提高,而不能仅仅限于在自己的工作范围之内,但是我做的工作,绝不是为了某些人而做,是为了给自己争口气,即所谓人活一张脸,树活一张皮!废话少说,进入正题,接着昨天的题目,继续js的数据类型。
Boolean类型
Boolean类型是js中使用的最多的一种数据类型,该类型只有两个值:true和false。这两个数值和数字值不是一回事,因此true不一定等于1,false也不一定等于0。如下实例是为变量赋Boolean类型值的例子:
var flag = true; var lost = false;
关于Boolean类型有一点需要注意的是Boolean类型的字面值是区分大小写的,也就是说True和False并不是Boolean类型数据,而只是普通标示符,但未了增加代码的易读性和避免一些不必要的问题出现,不建议用这两个标示符做变量。
虽然Boolean类型只有两个值,但是所有类型的数据都可以通过Boolean()函数转换成对应的Boolean类型值。如下实例代码所示:
var flag = "Hello World!"; var msg = Boolean(flag);
各种数据类型与Boolean类型的转换规则如下表所述:
数据类型 | 转换为true | 转换为false |
Boolean | true | false |
String | 任何非空字符串 | “”空字符串 |
Number | 任何非0数值,包括无穷大 | 0和Nan |
Object | 任何非空对象 | null |
Undefined | n/a | undefined |
根据以上规则,我们可以写出下面的一个代码实例:
function test(){ var flag = "Hello World!"; if(flag){ alert("write:true"); }else{ alert("write:false"); }}
Number类型
ECMAScript是使用IEEE754格式来表示整数和浮点数值。为了支持各种数值类型,ECMAScript-262定义了各种不同的数值字面量格式,常用的有十进制、八进制、二进制和十六进制。对于这些不同进制的数值转换,不在此一一介绍,如果需要,我会在后续的blog中详细描述。
上面说的是整数类型,还有一个浮点类型,浮点类型就是带小数点的数值,浮点数里面有一个知识点就是科学计数法,不在此介绍,我会在后续blog中一一陈述。
Number类型数据有一个数值范围的问题。ECMAScript并不能保存世界上所有的数值,最小的数值保存在Number的MIN_VALUE属性中,在大多数浏览器中的值是5e-324,最大值保存在Number的MAX_VALUE属性中,在大多数浏览器中的这个值是1.7976931348623157+308。如果计算的结果超出了这两个最值,那么久会得到一个特殊的Infinity,如果是负数,则相应的转为-Infinity(无穷)。Infinity是一个不能够参与计算的数值。如果不确定参与计算的数值是否为Infinity,可以使用isFinite()检测。如果是介于Infinity和-Infinity之间的数值,则返回true。
Number类的NEGATIVE_INFINITY和POSITIVE_INFINITY这两个属性分别保存着-Infinity和Infinity。
NaN类型
NaN(not a Number)是一个特殊的数值。在其他的编程语言中,任何数除以0都会返回异常,导致停止代码执行,而在js中,则会返回一个NaN,不会影响其他代码的执行。NaN本身有两个特点:
- 任何涉及到NaN的操作都会返回NaN,但是这个特点在多步计算中可能导致问题;
- NaN和任何值都不相等,包括NaN本身。
ECMAScript中的isNaN(para)可以用来判断参数是否“不是数值”。isNaN(para)在接收到一个值之后,会尝试将这个值转换为数值,某些不是数值的值可能会被转换成数值,如“10”或Boolean值。如下实例所示:
document.write(isNaN("10")); //false ,"10"被转换成10 document.write(isNaN(10)); //false,10是数字 document.write(isNaN(false)); // false,false被转换成0 document.write(isNaN(NaN)); //true,NaN不是 数值 document.write(isNaN("str")); //true,"str"不是数值
isNaN(para)也适用于对象。在基于对象调用isNaN()时,首先会调用对象的valueOf(),然后确定该返回值可否被转换成数值,如果不能,则再基于这个值调用toString()方法,再测试这个返回值。