ECMAScript 数据类型

数据类型

ECMAScript 中有5种简单数据类型(也称基本数据类型): UndefinedNullBooleanNumberString, 还有一种复杂数据类型——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中使用最多的一种类型, 该类型只有两个字面值: truefalse, 这两个值与数字不是一回事, true不一定等于1, false也不一定等于0。

需要注意的是, 虽然Boolean类型的字面值只有true和false两个, 但ECMAScript中所有类型的值都与这两个Boolean值等价的值。 要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean(),如下:

var message = "hello";
var messageAsBoolean = Boolean(message); // true

其他类型与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 本身有两个非同寻常的特点

  1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN
  2. NaN与任何值都不相等,包括NaN本身

针对NaN的这两个特点,ECMAScript定义了isNaN()函数,这个函数接受一个参数, 该参数可以是任何类型, 而函数会帮助我们确定这个参数是否”不是数值”。 isNaN()在接收到一个值之后,会尝试将这个值转换为数值, 某些不是数值的值会直接转换为数值,例如字符串”10”或Boolean值, 而任何不能被转换为数值的值都会导致这个函数返回true

isNaN(NaN); //true
isNaN(10); //true
isNaN("10"); //true (可以被转换为数值10)
isNaN(true); //true (可以被转换为数值1)
isNaN("bule"); //false (不能被转换为数值)
数值转换

有三个函数可以把非数值转换为数值: 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(""); // NaN
parseInt("0xA"); // 10
parseInt("22.5"); // 22
parseInt("070"); // 56(ECMAScript 3)、 0(ECMAScript 5)
parseInt("70", 8); // 56
parseInt("70"); //70

parseInt()可以指定第二个参数n, 函数会按照n进制解析字符串.

String 类型

String 类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。 字符串可以由单引号或者双引号表示, 在ECMAScript中,这两种表示方式并没有区别.

特点

ECMAScript中的字符串是不可变的, 也就是说,字符串一旦创建,它们的值就不能改变, 要改变保存的字符串, 首先要销毁原来的字符串, 然后再用另一个包含新值的字符串填充该变量

var lang  = "Java";
lang = lang + "Script";

对于第二行代码,实现过程为: 首先创建一个能容纳10个字符的新字符串, 然后在这个字符串中填充”Java”和”Script”,最后一步是销毁原来的字符串”Java”和字符串”Script”, 因为这两个字符串已经没有用了。这一过程在后台发生,而这也是在某些旧版本浏览器中,拼接字符串时速度很慢的原因所在.

转换为字符串

要把一个值转换为一个字符串有两种方式:第一种是使用几乎每个值都会有的toString()方法,

数值、布尔值、对象和字符串值都有toString()方法,多数情况下,该方法不需要传递参数, 但是,在调用数值的toString()方法时,可以传递一个参数: 输出数值的基数.

var num = 10;
num.toString(); // "10"
num.toString(2); // "1010"
num.toString(8); // "12"
num.toString(10); // "10"
num.toString(16); // "a"

在不知道要转换的值是不是nullundefined的情况下, 还可以使用函数String(), 这个函数能够将任何类型的值转换为字符串.

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;

String(value1); // "10"
String(value2); // "true"
String(value3); // "null"
String(value4); // "undefined"

Object 类型

ECMAScript中的对象其实就是一组数据和功能的集合。 对象可以通过执行 new操作符后跟要创建的对象类型的名称来创建。 而创建Object类型的实力并为其添加属性或方法,就可以创建自定义对象.

在ECMAScript中, 如果不给构造函数传递参数,则可以省略后面的那一对圆括号.

var obj = new Object();
var obj = new Object; // 两者是等价的, 但不推荐后者

Object的每个实例都具有下列属性和方法:

  • Constructor : 保存着用于创建当前对象的函数, 对于前面的例子而言,构造函数就是Object();
  • hasOwnProperty(propertyName) : 检查给定的属性是否在当前实例对象中
  • isPrototypeOf(object) : 用于检查传入的对象是否是另一对象的原型
  • propertyIsEnumerable(propertyName) : 用于检查给定的属性是否能够使用for-in语句来枚举
  • toLocaleString() : 返回对象的字符串表示,该字符串与执行环境的地区对应
  • toString() : 返回对象的字符串表示
  • valueOf() : 返回对象的字符串、数值或者布尔值表示。

参考资料:

  • JavaScript 高级程序设计