数据类型
JavaScript中有5中基本数据类型:Undefined, Null, Boolean, Number和String,还有一种复杂数据类型---Object。JavaScript不支持任何创建自定义类型的机制,而所有值都将是上述6种类型之一。
typeof操作符----检测给定变量的数据类型
"undefined"---“该值未定义”
"boolean"-----“该值是布尔值”
"string"--------“该值是字符串”
"number"------“该值是数值”
"object"--------“该值是对象或null”
"function"-------“该值是函数”
var message = "some string"; alert(typeof(message)); //"string" alert(typeof message); //"string" alert(typeof 12); //"number"
Number类型
最基本的数值字面量格式是十进制整数,除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示。
其中,八进制字面值的第一位必须是零(0),然后是八进制序列(0~7),如果字面值中的数值超出了范围,那么前导零将被忽略,后面的值被当做十进制的数值解析。
var octalNum1 = 070; //八进制的56 var octalNum2 = 079; //无效的八进制值---解析为十进制的79 var octalNum3 = 08; //无效的八进制值---解析为十进制的8
十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F),其中A~F可以是大写也可以是小写。
var hexNum1 = 0xA; //十六进制的10 var hexNum2 = 0x1f; //十六进制的31
浮点数值
在默认情况下,ECMAScript会将那些小数点后面带有6个零以上的数值转换为以e表示法表示的数值(例如,0.0000003会被转换成3e-7)。浮点数的最高精度是17位,但在进行算术计算时远不如整数。例如,0.1+0.2的结果不是0.3,而是0.30000000000000004,这个小小的舍入误差会导致无法测试特定的浮点数值。例如:
if(a+b == 0.3){ //不要做这样的测试 alert("You got 0.3"); }
因此,永远不要测试某个特定的浮点数值。
数值范围
由于内存限制,ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,在大多数浏览器中,这个数值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中,在大多数浏览器中,这个值是1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个值是正数,则会被转换成Infinity(正无穷)。
要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数之间),可以使用isFinite()函数,这个函数在参数位于最小与最大数值之间时会返回true,如下例所示:
var result = Number.MAX_VALUE + Number.MAX_VALUE; alert(isFinite(result)); //false
数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。Number()函数可以用于任何数据类型,而另外连个函数则专门用于把字符串转换为数值。由于Number()函数在转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用的是parseInt()函数。
parseInt()函数在转换为字符串的时候更多的是看其是否符合数值模式,它会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字字符或负号,parseInt()就会返回NaN。也即用parseInt()转换空字符串会返回NaN(Number()对空字符串返回0)。如果第一个字符串是数字字符,parseInt()会继续解析第二个字符,直至解析完所有字符或遇到了一个非数字字符。例如,“1234blue”会被转换为1234,“22.5”会被转换为22,因为小数点并不是有效的数字字符。
parseIn()能够识别朱各种整数格式(即十进制、八进制、十六进制)。也就是说,如果字符串以“0x”开头且后跟数字字符,就会将其当做一个十六进制数;如果字符串以“0”开头且后跟数字字符,则会将其当作一个八进制来解析。例如:
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(十六进制)
为了避免错误的解析,建议无论在什么情况下都明确指定基数---特别是像下面这样处理八进制的时候:
var num1 = parseInt("010"); //8(按八进制解析) var num2 = parseInt("010", 8); //8(按八进制解析) var num3 = parseInt("010", 10); //10(按十进制解析)
与parseInt()函数相似,parseFloat()函数也是从第一个字符(位置0)开始解析每个字符,而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符将被忽略。如“22.34.5”将会被转换为22.34。
除了第一个小数点有效之外,parseFloat()与parseInt()的 第二个区别在于它始终都会忽略前导的0。parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串始终会被转成0。由于parseFloat()只解析十进制值,因此它没有用第二个参数 指定基数的用法。最后还要注意一点,如果字符串包含的是一个可解析为整数的数(没有小数点,或小数点后都是0),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