javascript 中有5中数据类型:undefined、null、Boolean、Number、String,用typeof 检测数据类型。
1 Undefined :Undefined 只有一个值,即 undefined ,在用 var 声明变量但未对其加以初始化时,这个变量就是undefined。
注意:对未声明的变量执行typeof 返回的也是 undefined。
2 Null:NUll也只有一个值,null。从逻辑角度看,null 表示一个空对象指针。所以 typeof null 返回的是 object。实际上,undefined 是派生自null 值的,所以 null ==undefined 返回的是 true。
3 Boolean:有两个值,true 和 false。Boolean 类型的字面值 true 和 false 是区分大小写的。也就是说 True 和 False 都不是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(not applicable 不适用) | undefined |
根据以上规则,我们可以写出下面的一个代码实例:
function test(){ var flag = "Hello World!"; if(flag){ alert("write:true"); }else{ alert("write:false"); } }
4 Number:用IEEE754 格式来表示整数和浮点数,为了支持各种数值类型,ECMA-262 定义了不同的数值字面量格式。
var intNum = 55;//十进制整数
var octalNum = 070;//八进制 56,以8为基数,八进制字面值得第一位必须是0,后然是八进制数字序列0~7,如果字面值超出了范围,那么前导0将被忽略,后面竖直将被当作十进制解析。
var hexNum = 0x1f;//十六进制的31,前两位必须是0x,后面跟0~9及A~F(大小写都可以)的十六进制数字序列。
(1)浮点数:可以用科学记数法表示,3.125e7、3e-7。浮点数值的最高精度是17为小数,但在进行算术计算时其精度远远不如整数。例如,0.1 加 0.2 的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。例如
if(a + b ==0.3){
alert("You got 0.3 . ");
}
在这个例子中,我们测试的是两个数的和是不是等于0.3。如果这两个数是0.05 和0.25,或者是0.15 和 0.15 都不会有问题,但如果是0.1 和 0.2,那么测试将无法通过。所以,永远不要测试某个特定的浮点数值。(浮点数计算产生误差的问题,是基于IEEE754 数值的浮点计算的通病,所以其他语言也存在这个问题。)
(2)数值范围:5e-324 到 1.7976931348623157e+308。如果数值超出范围,则自动转换成特殊的Infinity(-Infinity) 值,这时,该值将无法继续参与下一次计算。要判断一个数值是不是无穷可以用isFinite()函数。
(3)NaN:非数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,例如任何数值除以0 返回NaN。任何涉及NaN的操作(NaN/10)都会返回NaN,NaN与任何值都不相等,包括NaN 本身。用isNaN()可以判断是不是"不是数值",isNaN ()也适用于对象。
(4)数值转换:Number()、parseInt()、parseFloat()。Number():可以用于任何数据类型。ParseInt()、parseFloat():专门用于把字符串转换成数值。三个函数对于同样的输入会有返回不同的结果。
Number()函数的转换规则如下:
如果是Boolean 值,true 和 false 分别被转换成1和0;
如果是数字,只是简单的传入和返回;
如果是null ,返回0;
如果是undefined ,返回NaN;
如果是字符串,遵循下面的规则:
如果字符串只包含数字(包括前面带正负号的情况),则将其转换为十进制数值,如"011"会变成11(前导0被忽略);
如果字符串中包含有效的浮点格式,则将其转换成浮点值(前导0被忽略);
如果字符串中包含有效的十六进制,如"0xf",则将其转换成相同大小的十进制整形数值;
如果字符串是空的(不包含任何字符),则转换成0 ;
如果字符串中包含除上述以外的字符,则将其转换成NaN;
如果是对象,调用valueOf()方法,依照前面规则转换。
parseInt():该函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直到找到第一个非空字符。如果第一个非空字符不是数字字符或负号,就会返回NaN,即parseInt("")=NaN,而Number("")=0,parseInt(‘1234blue ‘)=1234,parseInt(‘22.5‘)=22。parseInt(‘0xAF‘,16) =parseInt(‘AF‘,16),第二个参数指定是十六进制。
parseFloat():与ParseInt()类似,区别是:字符串中第一个小数点是有效的,后面的就是无效的;还有它只解析十进制的,没有第二个参数。
5 String:字符串,该类型包含一些特殊字符,即转义序列。
转换成字符串的方法:
toString():数值、布尔值、对象、字符串值都有这个方法,但是null、undefined的值没有这个方法;该方法可以传递参数,即二进制、十进制等,num.toString(10);
String():其他类型与toString()相同,但是null 返回"null",undefined 返回"undefined"。
6 特殊类型:Object
创建:var o = new Object();
构造函数constructor:如 Object();
检测属性是否存在hasOwnProperty():o.hasOwnProperty("name");
toString();
valueOf();