JavaScript数据类型共有6种:数值(number)、字符串(string)、布尔值(boolean)、undefined、null、对象(object)。
注:ES6新增了第7种类型Symbol,具体请参考ES6之Symbol数据类型一文的总结。
1 基本数据类型
1.1 数值
1.1.1 基础概念及语法
数值包括整数和小数(或者叫浮点数)两种,例如1
和3.14
。
-
实际上,在JavaScript内部,所有的数字都是以64位浮点数形式存储,即便整数也是如此。
注:某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算。
-
由于浮点数不是精确的值,因此在涉及小数的运算或比较时要格外小心。
-
JavaScript 能够表示的数值范围为21024~2-1023(开区间)。大于等于21024则会发生“正向溢出”,此时会返回
Infinity
;小于等于2-1075则会发生“负向溢出”,则会返回0
。 -
JavaScript提供了4种进制的整数表示方法:十进制、八进制、十六进制以及二进制。JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
- 十进制:没有前导0的数值。
- 八进制:前缀为
0o
(第二个是字母o)或00
的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 - 十六进制:前缀为
0x
或0X
的数值。 - 二进制:前缀为
0b
或0B
的数值。
-
在JavaScript内部存在2个
0
,一个是+0
,一个是-0
,区别就是表示它们的64位二进制数的符号位不同。但是它们是等价的(严格意义上的相等)。唯一不同的是当作分母时返回值不同。具体看如下测试:
-
NaN
作为一个特殊值,表示非数字(即Not a Number),测试如下:在下面的例子中,由于indexOf()
方法执行的是严格的相等运算(即===
),对NaN
不成立,因此会返回-1
。
-
Infinity
还有正负之分,Infinity
表示正无穷,-Infinity
表示负无穷。关于Infinity比较和运算的测试如下:
1.1.2 parseInt()方法
parseInt()
方法:用于将字符串转为整数。下面是一些典型的测试例子。
注意最后两个例子:若小数点前的数字多于21位,或者小数点后的0多于5位,则JavaScript会自动将数值转为科学计数法表示。
其实parseInt()
方法还可以接受第二个参数,第二个参数的范围位2~36
,表示被解析值的进制,返回该值对应的十进制数。由于第二个参数默认值为10,因此一般都省略第二个参数。
1.1.3 parseFloat()方法
parseFloat()
方法:用于将字符串转为浮点数。
1.1.4 isNaN()方法
isNaN()
方法:用来判断一个值是否为NaN
。
1.1.5 isFinite()方法
isFinite()
方法:用来判断一个值是否为正常的数值,其中像:Infinity
、-Infinity
、NaN
、undefined
、null
都为非正常数值,因此都会返回false
,而其他的数值则都返回true
。
1.2 字符串
1.2.1 基础概念及语法
-
字符串即我们所说的文本。具体地,字符串就是0个或多个排在一起的字符,并放在单引号或双引号之中。
规范:由于 HTML 语言的属性值使用双引号,所以很多项目约定 JavaScript 语言的字符串只使用单引号。
-
单引号内可以用双引号,双引号内也可以用单引号,若单引号内用单引号或双引号内用双引号,则可以借助转义符
\
来间接使用。 -
如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠,当然也可以使用
+
。//方式1 var longString = 'Long \ long \ long \ string';//输出时为单行,即“Long long long string” //方式2 var longString = 'Long ' + 'long ' + 'long ' + 'string';
1.2.2 转义符
反斜杠\
在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
常见的需要转义的特殊字符有:
\0
:null(\u0000
)\b
:后退键(\u0008
)\f
:换页符(\u000C
)\n
:换行符(\u000A
)\r
:回车键(\u000D
)\t
:制表符(\u0009
)\v
:垂直制表符(\u000B
)\'
:单引号(\u0027
)\"
:双引号(\u0022
)\\
:反斜杠(\u005C
)
1.2.3 字符串与数组的联系
字符串可以被视为字符数组,因此可以用数组的索引形式返回某个位置的字符。
1.2.4 length属性
字符串的length
属性会返回字符串的长度。
1.3 布尔值
布尔值有表示真假的两个特殊值,true
(真)和false
(假)。
注意:如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则为:除了undefined
、null
、false
、0
、NaN
或空字符串(''
或""
)会被转为false
,其他值都视为true
。
1.4 特殊值-null
null
表示空值,即值为空,null的类型其实是object(下面第二节有讲到)。
null
的一个使用场景:调用函数时,某个参数未设置任何值,这时就可以传入null
,表示该参数为空。
1.5 特殊值-undefined
undefined
表示未定义或不存在。
1.6 对象
对象就是各种值组成的集合。
1.6.1 对象
对象是数据组合的一种方式。
有关对象的更多内容请移步至JavaScript基本数据类型之对象-学习笔记
1.6.2 函数(function)
函数是处理数据的一种方法,JavaScript也将其作为一种数据类型,可以将函数赋值给变量。
有关函数的更多内容请移步至JavaScript基本数据类型之函数-学习笔记
1.6.3 数组(array)
数组也是数据组合的一种方式。
有关数组的更多内容请移步至JavaScript基本数据类型之数组-学习笔记
2 确定数据类型的方法
JavaScript有3种方法可以确定数据的类型:
typeof
运算符:返回数据的类型。下面有实践演示。instanceof
运算符:借助该运算符可以返回一个布尔值,表示对象是否为某个构造函数的实例,具体使用可以参考JavaScript面向对象之继承一文中1.4
小节的总结。Object.prototype.toString()
方法:可以精确地获得对象的类型。具体请参考:Object.prototype.toString() - JavaScript | MDN (mozilla.org)
总结:相比后两种方法,
typeof
运算符仅能判断基本数据类型,例如无法区分数组和对象的精确类型(因为它们的基本数据类型都为对象,看下面的测试就能明白);而后两种方法专门用来判断对象的具体类型。
下面我们重点了解下typeof
运算符,借助它可以返回一个值的数据类型,如下测试所示: