数据类型
ECMAScript中有五种简单数据类型:Undefined、Null、Boolean、Number、String。还有一种复杂数据类型Object。
typeof 操作符
typeof 用来检测给定变量的数据类型。对一个值使用typeof操作符可能会产生以下几种中的某个字符串
undefined —— 如果这个值未定义
boolean —— 如果这个值是布尔值
string —— 如果这个值是字符串
number —— 如果这个值是数值
object —— 如果这个值是对象或者是null
function —— 如果这个值是函数
typeof是一个操作符而不是一个函数。
Undefined
Undefined类型只有一个值,就是特殊的undefined,如果在用var声明变量却没有对它初始化时,这个变量的值就是undefined。例如:
var message;
alert(typeof message); //输出结果为:undefined
Null
Null是第二个只有一个值的数据类型。从逻辑角度来看,null值表示一个空对象指针,所以在使用typeof操作符检测null时会返回object。
实际上undefined是派生自null的,所以在以下比较重会返回true:
alert(null == undefined) //true
但是在声明变量可以不必刻意的将变量的值设置为undefined,但是对于null,如果要保存变量的对象还没有真正的保存对象时最好让该变量保存null值。这样不仅可以体现null是一个空对象指针,也便于区分undefined和null。
Boolean
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | Undefined |
var num1 = 070; //八进制的56
var num2 = 079; //9超出范围,所以被当成十进制,解析成79
var num3 = 0xA; //十六进制的10
alert(isNaN(NaN)); //true
alert(isNaN(10); //false
alert(isNaN("10")); //false,可以转换成数值10
alert(isNaN("blue")); //true,无法转化成数值
alert(isNaN(true)); //false,可以转成数值1
- 如果是Boolean值,true为1,false为0。
- 如果是数值,就是简单的传入和返回。
- 如果是null,返回0。
- 如果是undefined,返回NaN。
- 如果是字符串,则遵循以下规则:
如果是对象,则调用对象的valueOf()方法(把它变成字符串),然后依照前面的规则转换返回的值,如果是NaN,则调用对象
- 如果字符串中只包含数字,包括前面带正负号的情况,则将其转换成十进制数,即“1”会变成1,“123”会变成123,而“011”
- 会变成11,忽略了前面的0。
- 如果字符串中包含有效的浮点格式,如“1.1”就将其转成对应的浮点数值,即1.1。
- 如果字符串中包含十六进制格式如“0xf”,会把它转为大小相等的十进制数值,即15。
- 如果字符串为空,则转换为0。
- 如果字符串包含除上述格式以外的字符,都将其转换成NaN。
的toString()方法再来一遍。
(这排版惨不忍睹。。。。)
由于Number()函数在转换时复杂而又不合理,所以处理整数是就用paseInt(),它在转换时会忽略前面的空格然后看第一个找到的是
不是非数值,不是的话NaN,否则就继续找第二个,直到找完所有或者遇到一个不是数字的字符,然后这时就把前面找到的数字字符
转换成整数,例如:
var num1 = parseInt("123blue"); //123
var num2 = parseInt(""); //NaN
var num3 = parseInt("oxA"); //10,变成十进制了
var num4 = parseInt("22.5"); //22
var num5 = parseInt("70"); //70
如果发现你想把“070”转换成数值是可能不能很好地得到你想要的答案,因为字符串首位的0不知道是简单的数字0,还是八进制
的开头,所以在使用parseInt()时可以在第二个参数中指定它的基数,如parseInt("070",8),得到的就是56而不是70了。
parseFloat()同理,但是如果字符串中出现多个小数点,那么只有第一个小数点是有效的。
String
字符串的使用方式和Java中的并没有太多差别,字符串可以用单引号(‘ ’)或者是双引号(“ ”)来表示。
在ECMAScript中,字符串一旦创建它的值就不能改变,如果要改变的话就要先销毁原来的字符串,然后用新的字符串来填充该
变量,例如:
var lang = "Java";
lang = lang + "Script";
这里的第二行的过程如下:先创建一个能容纳十个字符的新字符串没然后把“Java“和“Script”填充进去,最后把原来的字符串“Java”
和“Script”销毁,因为它们已经失去利用价值了。当然,这个过程的发生我们是没办法看到的,因为是在后台进行的。
如果要把一个制转换成字符串,可以使用几乎每个值都有的toString()方法,又或是使用转型函数String()来进行转换,String()的
转换规则是:
如果值有toString()方法,就调用这个方法
如果是null,则返回“null”
如果是undefined,则返回“undefined”
因为null和undefined没有toString()方法,所以String就直接返回了这两个值的字面量。
Object
对象其实就是一组数据和功能的集合。对象可以通过new操作符后跟上要创建的对象类型名称来创建。而创建Object类型的实例
并为他添加属性或者方法就可以创建一个自定义的对象了:
var obj = new Object()
单单创建一个Object的实例其实没卵用,但是Object是所有对象的基础