ECMAScript有5种简单数据类型:Undefined、Null、Boolean、Number、String和一种复杂数据类型——Object。
1. Undefined 类型
Undefined类型只有一只值,即undefined。声明但未进行初始化的变量的值是undefined。具体请看下面的例子:
|
|
2. NUll类型
Null类型与Undefined类型一样也只有一个值,这个特殊值是null。null表示一个空对象指针,而这也正是typeof null === 'object'
的原因。
|
|
一般而言,如果定义的变量准备用于保存对象,那么最好将改变量初始化为null
,这样只要检测是否为null
就可以知道该对象是否为空。
|
|
实际上undefined
值是由null
派生出来的,因为ECMA-262规定,对它们进行相等性测试时,要返回true
|
|
提示:对于undefined
和null
这两个特殊值,需要明确它们的用途:无论在什么时候都没有必要将一个变量初始化为undefined
,但是很有必要将一个空对象初始化成null
。
3. Boolean类型
Boolean类型只有两个值true
和false
,需要注意的是true
不一定等于1,而false
也不一定等于0。另外这两个值区分大小写,True
和False
(以及其他的混合大小写)都不是Boolean值。
虽然Boolean只要两个值,但是所有类型的值都有与这两个值等价的值。可以调用转型函数Boolean()
,将其他类型的值转化成Boolean值。
各种数据类型转成Boolean值的规则:
数据类型 | 准换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任意非空字符 | “” (空字符串) |
Number | 任意非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a(N/A)是not applicable的缩写,意思是“不适用” | undefined |
4.Number类型
ECMAScript使用IEEE754格式来表示整数和浮点数(也叫双精度数值)。ECMAScript中,整数可以使用十进制、十六进制以及八进制来表示。
八进制第一位必须是0,然后是八进制的数字序列(0-7),如果字面数值超出范围,第一位的0将被忽略,当成十进制数值解析。
|
|
十进制字面量前两位必须是0x,后面跟任意十六进制的字符(0-9及A-F)。其中A-F可以大写,也可以小写。
|
|
提示:在进行算数运算时,所有八进制、十六进制表示的数值最终都将被转换成十进制的数值
4.1 浮点数值
所谓浮点数,就是有小数点的数。保存浮点数所需的空间是保存整数的两倍,因此ECMAScript会适当的将浮点数值转化成整数值。例如,当小数点后面没有跟任何数字时。更多浮点数的转换及表示请看下面的例子:
|
|
浮点数值的最高精度是17位小数,但是在进行算数计算时,其精度远远不如整数,例如:0.1加0.2的结果不等于0.3,而是0.30000000000000004。这个舍入误差会导致无法测试特定的浮点数值。
|
|
提示:关于浮点数的误差,是基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家,其他相同数值格式的语言也存在这个问题
4.2 数值范围
- ECMAScript能够表示的最小数值保存在
Number.MIN_VALUE
中,这个值是5e-324
- 能够表示的最大数值保存在
Number.MAX_VALUE
中,这个值是1.7976931348623157e+308
- 超出最小值会被自动转换成0,负数会转化成-0,正数会转化成0
- 超出最大值会被自动转换成
Infinity
(无穷大),负数会转换成-Infinity
,正数会转换成Infinity
-Infinity
无法再进行计算 - 可以使用
isFinite()
函数来检测某个数值是否是又穷的
|
|
提示:访问Number.POSITIVE_INFINITY 和Number.NEGATIVE_INFINITY 也可以得到正负的Infinty值
4.3 NaN
NaN即非数值(not a Number),是一个特殊的数值,这个数值表示一个本来要返回数值但是未返回数值的情况(这样就不会报错了)。例如:在其他语言中,任何数值除以0都会报错,但在ECMAScript中,会返回NaN。NaN有如下要注意的点:
- 任何涉及NaN的操作,都会返回NaN
- NaN与任何值都不相等,包括NaN本身
- 可以使用
isNaN()
函数确定一个值是否”不是数值“
|
|
提示:有意思的是isNaN()
同样适用于对象。对象调用isNaN()
首先会调用对象的valueOf()
方法,然后确定该方法是否可以转化为数值,如不能,会调用对象的toString()
方法,再测试返回值。而这个过程也是ECMAScript中内置很熟和操作符的一般执行流程
4.4 数值转换
有三个函数可以将非数值转换为数值:Number()
、parseInt()
、parseFloat()
。
Number()
可以用于任何数据类型parseInt()
用于将字符串转化成整型parseFloat()
用于将字符串转化成浮点型
4.4.1 Number()函数的转换规则
|
|
4.4.2 parseInt()函数的转换规则
- parseInt()会忽略字符串前面的空格,直至找到第一个非空字符。
- 如果第一个字符不是数字字符或者符号,parseInt()会直接返回NaN。也就是说用parseInt()转换空字符串会返回NaN,而Number()会返回0。
- 如果第一个字符是数字字符,parseInt()会继续解析后面的字符,直至解析完所有字符或者遇到了一个非数字字符。例如:
“123blue45”
会被解析为123
。22.5
会被解析为22
。 - parseInt()能够识别出各种格式(八进制、十六进制、十进制)。如果以“0x”开头且后面跟数字字符,就会当做十六进制,如果“0”开头且后跟数字字符,则会将其当做一个八进制数来解析。
- 使用parseInt()时,可以指定第二个参数:转换时使用的基数(即多少进制),这样可以保证得到正确结果(ECMAScript不同版本的这个方法存在差异)。多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的!
|
|
4.4.3 parseFloat()函数的转换规则
parseFloat()只解析十进制,因此它没有用第二个参数指定基数的用法。需要注意的是:如果一个字符串包含的是一个可解析为整数的数(没有小数点,或小数点后都是零),parseFloat()会返回整数。
|
|
5. String类型
- String类型用于表示由零个或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由
""
和''
表示。 - 字符串一旦创建就不能更改,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。这就是旧版本浏览器处理字符串很慢的原因所在。
5.1 字符串中的转义字符
字符串中包含一些特殊的字符字面量,也叫转义字符,或者具有其他用途的字符。这些字符字面量如下表所示:
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\‘ | 单引号(’),使用单引号表示字符串时。例如:’He said,\’hey.\’’ |
\“ | 双引号(”),使用双引号表示字符串时。例如:”He said,\“hey.\“” |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0-F)。例如:\x41 表示 “A” |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0-F)。例如:\u03a3表示希腊字符中的Σ |
以上字符可以出现在字符串任意位置,而且也将作为一个单独的字符来解析。例如:
|
|
5.2 转换为字符串的方式(两种)
- 转换为字符串有两种方式,第一种是使用几乎每个值( null和undefined除外)都有的toString()方法。
- toString()可以传递基数,通过传递基数toString()可以输出二进制、八进制、十进制、乃至其他任意的有效进制格式表示的字符串值
|
|
- 由于null和undefined没有toString()方法,所以在不知道要转换的值是不是null或者undefined时,可以使用String()方法将其转化成字符串。String()方法的转换规则如下:
|
|
- 转换为字符串的第二种方式是:把这个值与一个字符串(””)加在一起,例如:
123+“”
会得到“123”
提示:复杂的数据建议使用toString()
或String()
,简单的推荐使用加号链接的方式。
6. Object类型
在ECMAScript中,对象其实就是一组数据和功能的组合。创建对象的方式有两种,一种是通过new关键字,另一种是字面量的方式。
|
|
6.1 Object实例的属性和方法
- constructor:保存着用于创建当前对象的函数。上面例子中,constructor(构造函数)就是Object()。
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是实例的原型中)是否存在。例如: obj.hasOwnProperty(“age”),可以知道obj中是否含有“age”这个属性。
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
- propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,参数必须是字符串形式。
- toLocaleString(): 返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串、数值或布尔类型表示。通常与toString()方法的的返回值相同。
最后,附上一张脑图,方便大家理解和记忆!
本文是JavaScript基础系列的第一篇文章,后续会继续补上剩下的,欢迎持续关注!写总结真不容易,腰酸背痛的,但坚持就是胜利,为自己加油!(๑•̀ㅂ•́)و✧