JavaScript基本数据类型
ECMAScript中有五种简单数据类型(基本数据类型):Undefined,Null,Boolean,Number,String。
- Undefined 类型
Undefined类型只有一个值,即Undefined。使用 var 声明变量但没有对其初始化时,这个变量的值就是 undefined。
例如:
var message ; alert(message == undefined); //true
上面的代码只是声明了 message,没有对其初始化,所以 message 的值就是 undefined 。起始它与 var message = undefined ; 是等价的,但我们并没有必要这么做,因为未经初始化的值默认就是undefined 值。
还有,包含 undefined 值的变量与尚未定义的变量是不一样的,
例如:
1 var message ; 2 alert(message); //undefined 3 alert(age); //报错 4 5 alert(typeof message); //undefined 6 alert(typeof age); //undefined
第二行代码显示 message 的值, 即 undefined 。第三行代码由于 alert() 函数是尚未声明的变量 age ,则会导致一个错误。对于未声明过的变量,只能执行一个操作,就是用 typeof 检测其数据类型,不过有意思的是,对未初始化的变量执行 typeof 操作符返回的是 undefined ,对为声明的变量执行 typeof 操作符返回的也是 undefined。虽然这两种变量从技术角度看有着本质的区别,但实际上对哪种变量也不可能执行真正的操作。
- Null 类型
Null 类型也是只有一个值的数据类型,即 null 。从逻辑上看,null 值表示空对象指针,而这正是使用 typeof 操作符检测 null 值会返回 object 的原因,
例如:
var car = null ; alert(typeof null); // object
如果定义的变量准备将来用于保存对象,那么最好把这个变量初始化为 null 。这样一来,只要直接检测 null 值就可以知道相应的变量是否已经保存了一个对象的应用。
例如:
if ( car != null ){ // code ... }
有趣的是 null == undefined 为 true,实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定他们的相等性测试要返回 true。
- Boolean 类型
该类型有两个字面值,即 true 和 false。 true 不一定等于 1 , 而 false 也不一定等于 0 。以下为变量赋值boolean类型值的例子:
var found = true ; var lost = false ;
想要将一个值转换成为其对应的 Boolean 值,可以调应转型函数 Boolean() ,
例如:
var message = "Hello world"; var messageAsBoolean = Boolean(message);
可以对任何数据类型的值调用 Boolean() 函数,而且总会返回一个 Boolean 值,返回 true 或者 false 取决于转换值的数据类型及其实际值。
- Number 类型
1.浮点数值
浮点数值(在这里做个简单的介绍),就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,小数点前面可以没有整数,但是不推荐这种写法。
浮点数例子:
var floatNum1 = 1.1; var floatNum2 = 0.1; var floatNum3 = .1; // 不推荐
因为浮点数值需要的内存空间是整数的两倍,所以ECMAScript 会将浮点数值转换成为整数值。如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存,如果浮点数值本身就是一个整数,(如:10.0),那么该值也会被转换成为整数。
例如:
var floatNum1 = 1.; //小数点后面没有数字,解析为 1 var floatNum2 = 10.0; // 整数 解析为10
需要注意的是,浮点数值的最高精度是17位小数,但在进行计算时其精度远远不如整数。例如:0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004,这个小小的舍入误差可能会导致无法测试特定的浮点数值。
例如:
if( a + b == 0.3){ //不要做这样的测试 alert('you got 0.3'); }
永远不要测试某个特定的浮点数值!
2.数值范围
由于内存的限制,ECMAScrip并不能保存世界上所有的数值,能够表示的最小数值保存在 Number.MIN_VALUE 中,在大多数的浏览器中,这个值是 5e-324;能够保存最大数值保存在Number.MAX_VALUE 中,在大多数浏览器中,这个值是 1.7976931348623157e+308,如果某次计算超出了JavaScript 数值的计算范围,那么这个数值将会自动转换成特殊的 Infinity 值,这个值是负数的话,则会被转换成 -Infinity ,如果是正值的话,则会被转换成 Infinity 。如果某次计算返回了 Infinity ,是不能进行下次计算的。
3.NaN
NaN,即非数值(Not a Number),这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。在其他语言中任何数值除以非数值都会报错,停止代码运行,而在JavaScript中,任何数值除以非数值都会返回 NaN ,因此不会影响其他代码执行。
NaN 本身有两个特点,1.任何涉及NaN的操作都会返回 NaN。2.NaN与任何值都不相等,包括 NaN, 所以 NaN == NaN //false ,针对NaN的这两个特点,ECMAScript定义了 isNaN() 函数,该函数接受一个参数,参数可以使任何类型,而函数会帮我们判断这个参数是否“”不是数值”,isNaN()函数在接受到一个值后,会尝试将这个值转换成为数值,某些不是数值的值会直接转换为数值。
例如:
alert( isNaN(NaN) ); //true alert( isNaN(10) ); //false (10 是一个数值) alert( isNaN("10") ); //false (被转换成数值) alert( isNaN("hello") ); //true (不能被转换) alert( isNaN(true) ); //false (可以被转换成数值1)
4.数值转换
有三个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat()。第一个函数,即转型函数Number() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于同样的输入会有返回不同的结果。
Number() 函数的转换规则如下:
1.如果是Boolean值,true 和 false 分别转换成 1 和 0
2.如果是数字,只是简单地传入和返回
3.如果是null值,返回 0
4.如果是undefined,返回NaN
5.如果是字符串,会有如下几种情况:
5.1 如果字符串只包含数字,则将其转换为十进制数值,如果整数值前面带 0 ,则 0 会被忽略
5.2 如果字符串中包含有效的浮点格式,如 “1.1”,则将其转换成对应的浮点数值
5.3 如果字符串中包含有效的十六进制格式,同样会转为相同大小的十进制格式
5.4 如果是空字符串,则将其转换为 0
5.5 如果字符串中包含除上述以外的字符,则将其转换为 NaN
由于Number() 函数在转换字符串时比较复杂切不够合理,因此在处理整数的时候更多的用 parseInt() 函数,parseInt() 函数在转换字符串时,更多的是看其是否符合数值模式,他会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字或者负号,parseInt() 函数就会返回NaN。
例如:
var num1 = parseInt("1234abcd"); //1234 var num2 = parseInt(""); //NaN var num3 = parseInt("0xA"); //10 (十六进制) var num4 = parseInt("22.5"); //22
与 parseInt() 函数类似,parseFloat() 也是从第一个字符开始解析每个字符,一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止,也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。以下是使用parseFloat() 转换的例子:
var num1 = parseFloat("1234abcd"); //1234 var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.5.4"); //22.5
- String 类型
String 类型用于表示由零或多个16位Unicode字符组成的字符序列,简称就是 “字符串”,字符串可以由双引号(“”)或者单引号(‘’)表示, var nameA = "Jim"; var nameA = 'jack'; 这两种写法都是有效的。在ECMAScript中这两种语法形式没什么区别,单引号和双引号表示的字符串完全相同,不过以什么开头的就必须以什么作为结尾,否则会报语法错误。
1.字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列(转义符),用于表示非打印字符,或具有其他用途的字符。
(图片来自百度百科 )
这些字符串字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析。
例如: var text = "This is the letter sigma: \u03a3."; 这个例子中的 text 变量共有28个字符,但是6个字符长的转义序列表示为 1 个字符。
任何字符串的长度都可以通过访问其 length 属性取得,例如 alert(text.length); //输出28 。
2.字符串的特点
ECMAScript中的字符串时不可变的,字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充改变量。
例如:
var lang = "Java"; lang = lang + "Script";
"Java" 与 "Script" 都会被销毁,重新定义的结果为 "JavaScript"。
3.转换为字符串
要把一个值转换为字符串有两种方式,第一种是使用每个值都有的 toString()方法。
例如:
var age = 11 ; var ageAsString = age.toString(); //字符串"11" var found = true ; var foundAsString = found.toString();// 字符串 "true"
数值,布尔值,对象和字符串值都有toString()方法,但是null和undefined值没有这个放法。
在不知道要转换的值是不是null或者undefined的时候,还可以用String() ,这个函数能够将任何类型的值转为字符串。
String()函数遵循以下转换规则:
1.如果值有toString() 方法,则调用该方法并返回相应的结果
2.如果值为 null,则返回字符串 "null"
3.如果值undefined,则返回字符串 "undefined"
例如:
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"
这里先后转换了四个值,数值和布尔值的转换结果与调用toString()方法得到的结果相同,因为 null 和 undefined 没有 toString() 方法,所以String()函数就返回了这两个值的字面量。
完。
本文参考JS高级程序设计第三章