JavaScript中有5种基本数据类型:Undefined、Null、Boolean、Number和String。另外还有一种复杂类型Object。JavaScript不支持任何自定义类型,所有值都将是上述6种类型之一。
JavaScript提供了一种检测变量数据类型的手段——typeof。用typeof检测数据类型可能返回以下某个字符串:
"undefined":值未定义
"boolean":布尔类型
"string":字符串类型
"number":数值类型
"object":检测的值是对象类型或null
"function":函数类型
var a;
console.log(typeof a)
var b=1;
console.log(typeof b)
var c='aaa'
console.log(typeof c)
var d=null
console.log(typeof d)
var e=function (){}
console.log(typeof e)
运行以上代码,输出如下
属于Undefined类型的只有一个值,即undefined。用var声明的变量但未初始化时,这个变量的值就是undefined。
属于Null类型的只有一个值,即null。null值表示一个空对象指针,所以用typeof操作符检测null会返回“object”。
undefined值派生自null值,所以以下代码会输出true
var a;
console.log(a==null) //输出true
Boolean类型只有两个值:true和false。JavaScript中所有类型的值都可以转换成对应的Boolean值,要将一个值转为Boolean值,可以调用转型函数Boolean(),如下所示
var a="aaa";
console.log(Boolean(a)) //true
var b="";
console.log(Boolean(b)) //false
var c=100;
console.log(Boolean(c)) //true
var d=0;
console.log(Boolean(d)) //false
var e=function (){};
console.log(Boolean(e)) //true
var f=null;
console.log(Boolean(f)) //false
var g;
console.log(Boolean(g)) //false
Number类型使用IEEE754格式来表示整数和浮点数。为了支持各种数值类型,JavaScript定义了不同的数值字面量格式。
十进制整数可以直接在代码中输入,如下所示
var a=100;
整数除了十进制表示外,还可通过八进制(以8为基数)或十六进制(以16为基数)来表示。其中,八进制第一位必须是0,后面是数字序列(0~7),如果其中某个数值超出了范围,那么前面的0将被忽略,后面的数值将被当做十进制解析。例如
var a=070; //八进制的56
var b=079; //无效的八进制的数值,解析为十进制的79
var b=08; //无效的八进制的数值,解析为十进制的8
十六进制前两位必须是0x,后跟任何十六进制数字(0~9及A~F) 。其中,字母A~F大小写都可以。如下所示
var a=0xA; //十六进制的10
var b=0x1f; //十六进制的31
在进行算数计算时,所有以八进制和十六进制表示的数值,最终都将被转换成十进制。
所谓浮点数,就是该数值中必须包含一个小数点,并且小数点后面至少有一位数字,虽然小数点前面可以没有整数,但不推荐这种做法,以下是几个例子
var a=2.1;
var b=2.0;
var c=.2; //合法,但不推荐
如果小数点后面没有跟任何数字,那么这个数值将作为整数来保存。同样,如果浮点数本身表示的是整数,那么该值也会转换为整数,如下所示
var a=1.; //解析为1
var b=1.0 //解析为1
由于内存限制,JavaScript不能保存所有数值。JavaScript能够表示的最小数值保存在Number.MIN_VALUE中,值为5e-324,最大数值保存在Number.MAX_VALUE中,值为1.7976931348623157e+308,如果某次计算得到的值不在这个范围内,正数将会被转为Infinity(正无穷),负数将会被转为-Infinity(负无穷),并且这个数值不能再次参与计算,因为Infinity不是能够参与计算的数值。
console.log(Number.MIN_VALUE) //5e-324
console.log(Number.MAX_VALUE) //1.7976931348623157e+308
如果想确定一个数值是不是在最大值和最小值之间,可以使用isFinite()函数。如果返回true,证明在最大值和最小值之间,否则不在。
console.log(isFinite(100)) //true
console.log(isFinite(Number.MAX_VALUE+Number.MAX_VALUE)) //false
NaN是一个特殊的数值,即非数值, NaN用于表示一个本来应该返回数值的操作数未返回数值的情况,比如以下代码
console.log(10+'a') //输出10a
console.log(10-'a') //输出NaN
console.log(10*'a') //输出NaN
console.log(10/'a') //输出NaN
10+‘a’输出10a是因为数值与字符串相加的时候,数值会被转为字符串。
NaN有两个特点:
1、任何涉及NaN的操作都会返回NaN(比如NaN/10)
2、NaN与任何值都不相等,包括NaN本身
如果要判断一个数值是不是NaN,可以使用isNaN()函数。该函数接收单个参数,该参数可以是任何类型,请看下面代码:
console.log(isNaN(10)) //false
console.log(isNaN('10')) //false
console.log(isNaN('a')) //true
console.log(isNaN(true)) //false
console.log(isNaN(false)) //false
console.log(isNaN(null)) //false
console.log(isNaN(undefined)) //true
console.log(isNaN(function (){})) //true
JavaScript提供三个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat() 。Number()可以用于任何数据类型,另外两个则用于把字符串转为数值。以下是Number()函数对于不同类型的参数返回的不同结果:
console.log(Number(10)) //10
console.log(Number('10')) //10
console.log(Number('a')) //NaN
console.log(Number(true)) //1
console.log(Number(false)) //0
console.log(Number(null)) //0
console.log(Number(undefined)) //NaN
console.log(Number(function (){})) //NaN
由于Number()函数在转换字符串时候比较负责且不够合理,因此在处理整数的时候更常用的是parseInt()函数。以下是parseInt()函数对于不同类型的参数返回的不同结果:
console.log(parseInt(10)) //10
console.log(parseInt(10.5)) //10
console.log(parseInt('10')) //10
console.log(parseInt('10.5')) //10
console.log(parseInt('')) //NaN
console.log(parseInt('a')) //NaN
console.log(parseInt('12a')) //12
console.log(parseInt('a2')) //NaN
console.log(parseInt('a2b')) //NaN
console.log(parseInt('0xA')) //10(十六进制)
console.log(parseInt('070')) //56(八进制)
console.log(parseInt('0xf')) //15(十六进制)
console.log(parseInt(true)) //NaN
console.log(parseInt(false)) //NaN
console.log(parseInt(null)) //NaN
console.log(parseInt(undefined)) //NaN
console.log(parseInt(function (){})) //NaN
如果字符串第一个字符为数字, parseInt()函数会继续解析第二个字符,直到解析完所有后续字符或遇到一个非数字字符才结束。所以字符串'12a'和'10.5'分别解析成12和10(小数点并不属于数字)
parseInt()还可以提供第二个参数,指定转换时使用的基数是多少进制,比如:
var num = parseInt("0xAF", 16); 指定采用十六进制基数。这是因为在ECMAScript 3 JavaScript引擎中,以0开头的参数在某些情况下会被当做八进制字面量,而在ECMAScript 5 JavaScript引擎中,parseInt()已经不提供解析八进制的功能。
var a=parseInt('10',2) //按二进制解析
var b=parseInt('10',8) //按八进制解析
var c=parseInt('10',10) //按十进制解析
var d=parseInt('10',16) //按十六进制解析
如果不指定第二个参数,则由parseInt()决定采用哪种进制解析,因此为了避免错误,推荐任何情况下都不要省略第二个参数。
parseFloat()与parseInt()的规则类似,如果字符串第一个字符为数字, parseFloat()函数会继续解析第二个字符,直到解析完所有后续字符或遇到一个非数字字符才结束。区别是parseFloat()会忽略开头的0,而且parseFloat()只可以转换十进制的数值。以下是parseFloat()函数对于不同类型的参数返回的不同结果:
console.log(parseFloat(10)) //10
console.log(parseFloat(10.5)) //10.5
console.log(parseFloat('10')) //10
console.log(parseFloat('10.5')) //10.5
console.log(parseFloat('')) //NaN
console.log(parseFloat('a')) //NaN
console.log(parseFloat('12a')) //12
console.log(parseFloat('a2')) //NaN
console.log(parseFloat('a2b')) //NaN
console.log(parseFloat('0xA')) //0
console.log(parseFloat('070')) //7
console.log(parseFloat('0xf')) //0
console.log(parseFloat(true)) //NaN
console.log(parseFloat(false)) //NaN
console.log(parseFloat(null)) //NaN
console.log(parseFloat(undefined)) //NaN
console.log(parseFloat(function (){})) //NaN
String类型即字符串类型,由英文的单引号或双引号表示,以下两种写法都是合法的:
var a='a';
var b="b";
String 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。这些字符字面量如下表所示:
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\' | 单引号 ( ' ) ,在用单引号表示的字符串嵌套中使用,例如: 'I say: \'hello\' ' |
\" | 双引号 ( " ) ,在用双引号表示的字符串嵌套中使用,例如: "I say: \"hello\" " |
\xnn | 以十六进制代码 nn 表示的一个字符(其中 n 为 0 ~ F)。例如, \x41 表示 'A' |
\unnnn | 以十六进制代码 nnnn 表示的一个 Unicode 字符(其中 n 为 0 ~ F)。例如, \u03a3 表示希腊字符 Σ |
var text = "The letter is: \u03a3.";
console.log(text) //The letter is: Σ.
任何字符串都可以调用length来获取长度
var text = "The letter is: \u03a3.";
console.log(text.length) //17
第一种方式是调用toString()方法。数值、布尔值、对象和字符串值都有toString()方法。但null和undefined没有这个方法,一般情况下,调用toString()方法无需传递参数,但在调用数值的toString()方法时,可以传递一个参数,指定输出数值的基数。
var a = 20;
console.log(a.toString()) //20
console.log(a.toString(2)) //10100
console.log(a.toString(8)) //24
console.log(a.toString(10)) //20
console.log(a.toString(16)) //14
为了防止被转换的值为null或undefined,可以在转换前使用String()函数将被转换值强制转为字符串String()函数的几种返回结果如下:
console.log(String(null)) //'null'
console.log(String(undefined)) //'undefined'
console.log(String(100)) //'100'
console.log(String(true)) //'true'
console.log(String(false)) //'false'
console.log(String(function (){})) //'function (){}'
第二种方式可以将被转换的值与一个空字符串相加,比如:
console.log(100+'') //'100'
这种方式也是开发者经常使用的。
Object类型是所有它的实例的基础,可以通过以下代码创建一个Object对象的实例:
var obj=new Object();
Object的每个实例都具有下列属性和方法:
1、constructor:构造函数
2、hasOwnProperty(propertyName):检查当前对象中是否包含给定的属性
3、IsPrototypeof(objec):检查传入的对象是否是传入对象的原型
4、propertyIsEnumerable(propertyName):检查对象属性是否可以执行for-in语句
5、toLocalString:返回对象字符串
6、toString():返回对象字符串
7、valueOf():通常返回值与toString一样
在实际开发中,Object类型很少被单独拿出来使用,所以本文不深入讲解Object类型,有关Object类型更深入的讨论,将在后续相关篇章中逐一讲解。
本文讲解了JavaScript中的7种类型:Undefined、Null、Boolean、Number、String、Object,以及类型之间的转换方式:Number()、parseInt()、parseFloat()、toString()。灵活掌握这几种类型的应用,为后续更深入的学习打下坚实的基础。