数据类型
ECMAScript 中有5种简单数据类型(也称基本数据类型): Undefined
、Null
、Boolean
、Number
和String
, 还有一种复杂数据类型——Object
, Object本质上是由一组无序的键值对
组成的。 ECMAScript 不支持任何类型创建自定义类型的机制,而所有值都将是上述6种数据类型之一。
typeof 操作符
typeof
操作符用于检测给定变量的数据类型, 该操作符可能返回下列某个字符串:
"undefined"
—— 如果这个值未定义;"boolean"
—— 如果这个值是布尔值;"string"
—— 如果这个值是字符串"number"
—— 如果这个值是数值"object"
—— 如果这个值是对象或null
"function"
—— 如果这个值是函数
Undefined 类型
Undefined 类型只有一个值,即特殊的undefined, 在使用var生命变量但未对其加以初始化时,这个变量的值就是undefined。
ECMA-262第 3 版之前的版本中并没有规定undefined
这个值, 第3版引入这个值是为了正式区分空对象指针与未经初始化的变量.
Null 类型
Null类型也是一个只有一个值的数据类型, 这个特殊的值是null, 从逻辑角度看, null值表示一个空对象指针,而这正是使用typeof操作符检测null值时会返回”object”的原因.
实际上,undefined 是派生自null值的, 因此ECMA-262
规定对它们的相等性测试要返回true
.
只要意在保存对象的变量还没有真正地保存对象, 就应该明确地让该变量保存null 值, 这样,只要检查null值就可以知道相应的变量是否已经保存了一个对象的引用.
Boolean 类型
Boolean类型是ECMAScript中使用最多的一种类型, 该类型只有两个字面值: true
和false
, 这两个值与数字不是一回事, true不一定等于1, false也不一定等于0。
需要注意的是, 虽然Boolean类型的字面值只有true和false两个, 但ECMAScript中所有类型的值都与这两个Boolean值等价的值。 要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()
,如下:
var message = "hello"; |
其他类型与Boolean类型的转换规则:
数据类型 | 转换为true 的值 |
转换为false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | N/A(不适用) | undefined |
Number 类型
- 整数值
- 浮点数
数值范围
ECMAScript 并不能保存世界上所有的数值, ECMAScript能够表示的最小数值保存在Number.MIN_VALUE
中——在大多数浏览器中, 这个值是5e-324; 能够表示的最大数值保存在Number.MAX_VALUE
中——在大多数浏览器中,这个值是1.7976931348623157e+308。 如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将会被自动转换成特殊的Infinity
值, 具体来说, 如果这个数值是负数,会被转换成-Infinity
(负无穷), 如果这个数值是正数,则会被转换为Infinity
(正无穷)
如果某次计算返回了正无穷或负无穷, 那么这个值将无法参与下一次的计算, 因为Infinity
不是能够参与计算的数值。 判断一个数值是否是有穷的,可以使用isFinite()
函数,这个函数在参数位于最小与最大值之间时会返回true
.
NaN
NaN (Not a Number), 即非数值是一个特殊的数值, 这个数值用于表示一个本来要返回数值的操作未返回数值的情况。
NaN 本身有两个非同寻常的特点
- 任何涉及NaN的操作(例如NaN/10)都会返回NaN
- NaN与任何值都不相等,包括NaN本身
针对NaN的这两个特点,ECMAScript定义了isNaN()
函数,这个函数接受一个参数, 该参数可以是任何类型, 而函数会帮助我们确定这个参数是否”不是数值”。 isNaN()
在接收到一个值之后,会尝试将这个值转换为数值, 某些不是数值的值会直接转换为数值,例如字符串”10”或Boolean值, 而任何不能被转换为数值的值都会导致这个函数返回true
。
isNaN(NaN); //true |
数值转换
有三个函数可以把非数值转换为数值: Number()
、parseInt()
、parseFloat()
。 Number()
可以用于任何数据类型, 后两个函数专门用于把字符串转换为数值.
Number()函数转换规则:
- 如果是Boolean值, true和false分别被转换为1和0
- 如果是数字值, 只是简单的传入和返回
- 如果是null值, 返回0
- 如果是undefined, 返回NaN
- 如果是字符串,遵循以下规则
- 有效的数字形式会被转换为10进制,前导0会被忽略,也就是说,八进制会被当做十进制, “011”会变成11
- 空字符串将被转换为0
- 除此之外,其他字符串将会转换为NaN
- 如果是对象, 会调用对象的
valueOf()
方法, 然后依照前面的规则转换返回的值。 如果转换的结果是NaN, 则调用对象的toString()
方法, 然后再次依照前面的规则转换返回的字符串值.
parseInt()
会忽略字符串前面的空格, 知道找到第一个非空格字符, 付过第一个字符不是数字字符或者负号, parseInt()
就会返回NaN; 也就是说, parseInt()转换空字符串会返回NaN, 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后序字符或者遇到一个非数字字符.
parseInt("1234blue"); // 1234 |
parseInt()
可以指定第二个参数n, 函数会按照n进制解析字符串.
String 类型
String 类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。 字符串可以由单引号或者双引号表示, 在ECMAScript中,这两种表示方式并没有区别.
特点
ECMAScript中的字符串是不可变的, 也就是说,字符串一旦创建,它们的值就不能改变, 要改变保存的字符串, 首先要销毁原来的字符串, 然后再用另一个包含新值的字符串填充该变量
var lang = "Java"; |
对于第二行代码,实现过程为: 首先创建一个能容纳10个字符的新字符串, 然后在这个字符串中填充”Java”和”Script”,最后一步是销毁原来的字符串”Java”和字符串”Script”, 因为这两个字符串已经没有用了。这一过程在后台发生,而这也是在某些旧版本浏览器中,拼接字符串时速度很慢的原因所在.
转换为字符串
要把一个值转换为一个字符串有两种方式:第一种是使用几乎每个值都会有的toString()
方法,
数值、布尔值、对象和字符串值都有toString()
方法,多数情况下,该方法不需要传递参数, 但是,在调用数值的toString()
方法时,可以传递一个参数: 输出数值的基数.
var num = 10; |
在不知道要转换的值是不是null
或undefined
的情况下, 还可以使用函数String()
, 这个函数能够将任何类型的值转换为字符串.
var value1 = 10; |
Object 类型
ECMAScript中的对象其实就是一组数据和功能的集合。 对象可以通过执行 new
操作符后跟要创建的对象类型的名称来创建。 而创建Object
类型的实力并为其添加属性或方法,就可以创建自定义对象.
在ECMAScript中, 如果不给构造函数传递参数,则可以省略后面的那一对圆括号.
var obj = new Object(); |
Object的每个实例都具有下列属性和方法:
Constructor
: 保存着用于创建当前对象的函数, 对于前面的例子而言,构造函数就是Object();hasOwnProperty(propertyName)
: 检查给定的属性是否在当前实例对象中isPrototypeOf(object)
: 用于检查传入的对象是否是另一对象的原型propertyIsEnumerable(propertyName)
: 用于检查给定的属性是否能够使用for-in
语句来枚举toLocaleString()
: 返回对象的字符串表示,该字符串与执行环境的地区对应toString()
: 返回对象的字符串表示valueOf()
: 返回对象的字符串、数值或者布尔值表示。
参考资料:
- JavaScript 高级程序设计