1.五种基本数据类型
JavaScript有五种基本数据类型:Undefined,Boolean,Null,Number,String。
因为JavaScript是弱类型语言,一个变量可以赋值为任意数据类型,所有我们需要使用typeof关键字判断变量的数据类型。
typeof关键字将根据变量的数据类型返回一个字符串:
Undefined | Boolean | Number | String | Null | |
typeof 返回得道字符串 | undefined | boolean | number | string | object |
1.1 Undefined类型
一个变量在声明后未经初始化,将会自动获得Undefined数据类型。Undefined数据类型只有一个字面量undefined,尽管可以显示地用字面量undefined为变量赋值,但这样做毫无意义.
var foo;//没有初始化
var boo=undefined;//使用undefined字面量现实地初始化
alert(typeof foo);//undefined
alert(typeof boo);//undefined
在JavaScript中如果使用一个没有声明的变量会报错,但是如果使用typeof检测一个未经声明的变量居然是可以行得通的,其返回的结果也是"undefined":
var foo;//没有初始化
//变量voo没有声明
alert(typeof foo);//undefined
alert(typeof voo);//undefined
因此,最佳实践是在声明一个变量地同时显示地初始化,如果能够做到这一点,那么当 typeof 操作符返回"undefined"值时, 我们就知道被检测的变量还没有被声明,而不是尚未初始化。
1.2 Null
Null值表示一个空地对象指针,这也是为什么使用typeof时返回的时object。
Null类型只有一个字面量null,无论在什么情况下 都没有必要把一个变量的值显式地设置为 undefined,可是同样的规则对 null 却不适用。换句话说, 只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。
var foo=null;
alert(typeof foo);//object
1.3 Boolean
Boolean类型表示真或假,它有两个字面量true和false,注意true和false都是区分大小写的,也就是说True和False等其他任何混合大小写形式都不是Boolean的字面量。
var zhen = true;
var jia = false;
alert(typeof zhen);//boolean
alert(typeof jia);//boolean
1.4 Number
1.4.1 数字字面量
与其他语言区分整型和浮点型不同,JavaScript中任何数字类型都是用Number类型表示。
整数(十进制,八进制,十六进制),浮点数(普通表示法,科学计数法)都是Number类型的字面量:
var intNum = 55;//十进制整数
var octalNum = 055;//八进制整数
var hexNum = 0x55;//十六进制整数
var floatNum1 = 1.1;//一个浮点数
var floatNum2 = 1.7e10;//浮点数的科学计数法
1.4.2 特殊字面量
除此之外,Number类型还有其他几个特殊的字面量:NaN,Infinity,-Infinity。
NaN(Not a Number)
NaN,表示任何一个计算过程中本来要返回一个Number类型却无法返回Number的值,比如0除以0:
var n =0/0;//这在其他语言中一定会报错,但在JavaScript中并不会这正是因为有NaN
alert(n);//NaN
alert(typeof n);//Number
alert(isNaN(n));//true
注意在代码的最后一行判断一个变量是否是NaN使用的是函数isNaN(),这是因为NaN无法参与运算,它与任何值都不相等包括NaN本身(NaN==NaN永远返回false)。
isNaN()不仅可以运算Number类型,其他数据类型也可以运算,在运算时isNaN()会把其他数据类型转换成Number类型再判断是否是NaN。
-Infinity和Infinity
如果数值计算超过了JavaScript可以表示的数值类型范围,就会得道Infinity和-Infinity,这两个值都无法参与下一次运算。
可以使用isfinity()判断一个数据是否超过了JavaScript的表示范围:
alert(isFinite(10));//true
alert(isFinite(Number.MAX_VALUE+Number.MAX_VALUE));//false
1.5 String
String类型用来表示0个或多个16位Unicode字符序列。
与PHP不同,在JavaScript中使用(")与(')没有任何区别:
//这两个用法都是合法的没有任何区别
var str1 = "hello world";
var str2 = 'hello world';
var str3 = "hello world';//两边符号不一致,这是不合法的
如果想要拼接两个字符串可以使用操作符(+):
var str1 ="hello";
var str2 = "world";
alert(str1+" "+str2);//hello world
还有一点需要注意,在(")表示的字符串中的(')或者在(')表示的字符串中的(")都将当作正常字符来解析:
var str1 = "his name is 'tom'";
var str2 = 'her name is "lucy"';
alert(str1);//his name is 'tom'
alert(str2);//her name is "lucy"
2.基本数据类型之间的转换
基本数据类型之间是可以进行转换的,由于Null,Undefined不能参与运算因此下面主要讨论Boolean,Number,String类型之间的转换
2.1 其他数据类型转换为Boolean
可以使用Boolean()函数将其他数据类型转换为Boolean类型。
Boolean()函数的转换将遵循以下规律:
对于字符串,任何非空字符串都将转换为true:
var str1="hello";//非空字符串
var str2="";//空字符串
alert(Boolean(str1));//true
alert(Boolean(str2));//false
对于Number,除了NaN都将转换为true(包括Infinity):
alert(Boolean(NaN));//false
alert(Boolean(Infinity));//true
alert(Boolean(-Infinity));//true
alert(Boolean(100));//true
2.2 其他数据类型转换为String
2.2.1 Number类型转换为String
对于Number类型可以使用toString()方法:
alert(typeof NaN.toString());//string
alert(typeof Infinity.toString());//string
alert(typeof 1.27e10.toString());//string
toString()还有一个更厉害的用法,它可以传递一个参数指定Number类型的数制:
var num =10;
alert(num.toString(10));//十进制10
alert(num.toString(2));//二进制1010
alert(num.toString(8));//八进制12
alert(num.toString(16));//十六进制a
2.2.2 String()函数
如果是其他数据类型可以使用String()函数,这个函数对于Null类型和Undefined类型也是可以使用的,可以说它通用性更好。
alert(typeof String(undefined));//string
alert(typeof String(null));//String
2.3 其他数据类型转换为Number
2.3.1 Number()函数
可以使用Number()函数将其他数据类型转换为Number类型:
alert(Number(undefined));//NaN
alert(Number(null));//0
alert(Number(true));//1
alert(Number(false));//0
alert(Number("1000"));//1000
alert(Number("1000aa"));//NaN
2.3.2 parseInt()和parseFloat()
Number()函数对于转换字符串不够智能,因此对于字符串通常都是使用parseInt()和paseFloat():
alert(parseInt("1111aaa"));//1111,paseInt()可以提取出字符串中的数字但前提首个字符必须是数字
alert(parseInt("0x11"));//17,parseInt()可以识别其他进制的数字
alert(parseInt("11",16));//17,可以使用第二个参数指定需要转换的字符串的进制