ECMAScript 5种基本数据类型介绍、使用时注意事项及类型转换时需遵循的原则

来源:互联网 发布:恒久软件 义齿 编辑:程序博客网 时间:2024/06/15 20:39

ECMAScript 5种基本数据类型简介

ECMAScript中有5种基本数据类型,1种复杂数据类型,不支持任何创建自定义类型的机制,所有运算过程中的值最终都是其6种数据类型之一!


5种基本数据类型:

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String

基本数据类型: Undefined类型

该类型只有一个值为undefined的数据类型

在使用var声明变量,但未对其初始化时,这个变量的值就是undefined.


示例:

var msg;console.log(msg == undefined); // trueconsole.log(typeof msg); // "undefined"

注意:

  • 不需要显示将一个变量初始化为undefined值
  • ECMA-262 第三版引入这个值是为了正式区分空对象指针与未经初始化的变量。
  • 声明但未初始化的变量与未声明的变量是有区别的!使用时,前者默认值为“undefined”, 后者会报错。如alert(unVarMsg) 会报错 ;但未声明的变量可以使用typeof 操作符,返回同样的“undefined”


基本数据类型: Null类型

该类型只有一个值为null的数据类型

null值表示一个空对象(Object)的指针


示例:

var car = null;console.log(typeof car); // "object"

注意:

  • 如果定义一个变量,目的是准备存储对象, 那么规范的做法是将该变量初始化为null
  • 注意判断一个变量类型时,如果使用相等操作符(==)时,null和undefined返回true,因为undefined值是派生自null值得,因此ECMA-262规定对它们的相等测试要返回true;同时需要提及的是相等操作符(==)会做类型转化,全等操作符(===)不会做类型转化,返回结果为false,这些后面文章会讲。


基本数据类型: Boolean类型

该类型只有两个字面值:true和false


示例:

var found = true;var lost = false;

注意:
  • Boolean字面值true和false是区分大小写的, 也就是说True和False都不是Boolean值
  • Boolean字面值true和false与数字值没有直接关系,也就是说true不一定等于1, 而false不一定等于0(注意在条件语句中的true、false与数值比较时,系统会在后台自动做类型转换进行比较,这部分后面文章会提及)
  • ECMAScript中所有类型的值都有与这两个Boolean值等价的值, 可以使用转型函数Boolean(),具体转化规则如下表

数据类型转化为true的值转换为false的值BooleantruefalseNumber任何非0数值(包括无穷大)0和NaNUndefinedn/aundefinedString任何非空字符串“” - 空字符串Object任何对象null

这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转化非常重要,例如下面示例中if条件语句中,会对msg自动执行Boolean转换

var msg = "Hello World!";if (msg){  console.log(msg); // Hello World!}

基本数据类型: Number类型

为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式。

最基本的数值字面量格式是十进制整数

此外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示。


八进制,面值的第一位必须是0,然后是八进制数字序列(0~7),如果字面值中的数值超出了范围,前导0江北忽略,后面的数值将被当做十进制数值解析

var octalNum1 = 070; // 八进制的56(7*8+0*1)var octalNum2 = 08; // 无效八进制,解析为8

注意: 八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。


十六进制,面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母A~F可以大写,也可以小写

var octalNum1 = 0xA; // 十六进制的10var octalNum2 = 0x1f; // 十六进制的31

注意:

  • 在进行算数计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值


浮点数值

所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但我们不推荐这种写法。


示例:

var floatNum1 = 1.1;var floatNum2 = 0.1;var floatNum3 = .1; //有效,但不推荐

对于那些极大或极小的数值,可以用e表示法(科学计数法)表示浮点数值。 用e表示法表示的数值等于e前面的数值乘以10的指数次幂。

表示格式为: 一个数值(整数或浮点数)e(或E)10的幂指数

示例:

var floatNum1 = 3.125e7 //31250000var floatNum2 = 3e-2 //0.03

注意:
  • 默认情况下,ECMAScript将会那些小数点后面带有6个0以上的浮点数值转换为以e表示法表示的数值。


浮点数值的最高精度为17位小数,但计算式精度不准确,如: 0.1 + 0.2的结果并不是0.3. 所以不要做关于浮点数值判断的测试(如: console.log(0.1 + 0.2 == 0.3); // false).

关于浮点数值计算会产生舍入误差的问题,这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家;其他使用相同数值格式的语言也存在这个问题。


数值范围

受限于内存,ECMAScript并不能保存世界上所有的数值, ECMAScript能够表示最小的数值保存在Number.MIN_VALUE中(大多数浏览器中,这个只是5e-324);能够表示的最大数值保存在Number.MAX_VALUE中(大多数浏览器中,这个值是1.7976931348623157e+308).

console.log(Number.MIN_VALUE); // 5e-324console.log(Number.MAX_VALUE); // 1.7976931348623157e+308

如果计算超出上述限制时,数值将被自动转换成特殊的Infinity值,具体来说,如果这个数值是负数,则会被转换为-Infinity(负无穷),如果是正数,则会被转为Infinity(正无穷),另外也可以通过Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY得到负的和正的Infinity值

console.log(Number.MIN_VALUE - Number.MAX_VALUE - Number.MAX_VALUE); // -Infinityconsole.log(Number.MAX_VALUE + Number.MAX_VALUE); // Infinity
计算前可以使用isFinite()函数判断代计算值是不是非Infinity值。

console.log(isFinite(Infinity)); // falseconsole.log(isFinite(1)); // true

NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如数值除以0,在ECMAScript中,0除以0返回NaN, 正数除以0返回正无穷,负数除以0返回负无穷; 任何涉及NaN的操作都会返回NaN,NaN与任何值(包括NaN本身)都不相等

console.log(0/0); // NaNconsole.log(1/0); // Infinityconsole.log(-1/0); // -Infinityconsole.log(NaN/10); // NaNconsole.log(NaN == NaN); // falseconsole.log(NaN === NaN); // false

针对NaN, ECMAScript提供了isNaN()函数,该函数接受一个参数,参数可以是任何类型,函数会帮我们判断传入的参数是否“不是数值”,函数在接收到一个值之后,会尝试将这个值转换为数值,不能被转化为数值的值都将导致这个函数返回true

console.log(isNaN(NaN)); // trueconsole.log(isNaN(10)); // falseconsole.log(isNaN('10')); // falseconsole.log(isNaN('hello')); // trueconsole.log(isNaN(true)); // falsevar obj = new Object();console.log(isNaN(obj)); // true
在基于对象调用isNaN()函数时,会受限调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString()方法,在测试返回值。

3种数值转换函数

  1. 任何数据类型转换为Number类型 - Number()函数
  2. 仅限字符串转Number类型 - parseInt()函数
  3. 仅限字符串转Number类型 - parseFloat()函数

Number()转换表

数据类型转化值Booleantrue - 1; false-0UndefinedNaNNullnull - 0String

  • 如果字符串中只包含数字,则转为十进制数值
  • 如果字符串中包含有效的浮点格式,将转为对应的浮点数值
  • 如果字符串中包含有效的十六进制格式,则转为对应的十进制数值
  • 如果字符串是空(“”),则将其转化为0
  • 如果包含除上述格式外的
Object            调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN, 则调用对象的toString()方法,然后再次依照前面的规则转换反悔的字符串值。


示例:

console.log(Number('Hello world!')); // NaNconsole.log(Number("")); // 0console.log(Number(" 1 ")); // 1console.log(Number("-1")); // -1console.log(Number(" -1 ")); // -1console.log(Number(" +1 ")); // 1console.log(Number("00011")); // 11console.log(Number(true)); // 1

由于Number()函数在转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用的是parseInt()函数


parseInt()函数

该函数在转换字符串时,更多的是看其是否符合数值模式,执行流程如下:

  • 会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN
  • parseInt()转换空字符串会返回NaN(Number()返回0)
  • 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到一个非数字字符。

console.log(parseInt("")); // NaNconsole.log(parseInt("123Blue")); // 123console.log(parseInt("0xA")); // 10console.log(parseInt("2.2")); // 2

注意:
  • ECMAScript 5 JavaScript引擎中,parseInt()已经不具有解析八进制值得能力
  • 为了消除在使用parseInt()函数在进制上的困惑,可以为这个函数提供第二个参数-转换时使用的基数(多少进制),如:

console.log(parseInt('0xAF', 16)); // 175console.log(parseInt("AF", 16)); // 175console.log(parseInt("AF")); // NaN

parseFloat()函数

与parseInt()最大区别在于parseFloat()只解析十进制,因此没有第二个参数指定基数的用法。同时它会忽略前导0.

其他与parseInt()函数类似,也是从第一个字符开始解析每个字符,而且是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符位置。也就是说,字符串中的第一个小数点是有效的,第二个无效。

console.log(parseFloat("0xAF")); // 0console.log(parseFloat("2.1.2")); // 2.1console.log(parseFloat("2")); // 2console.log(parseFloat("2Blue")); // 2


基本数据类型: String类型

String 类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。

字符串可以用双引号(“”)或单引号(‘’)表示, 两种写法都有效


示例:

var str = "Hello World!"; // 等同于'Hello World!'


字符字面量

String 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者其他用途的字符,如:

字面量含义\n换行\t指标\b退格\r回车\f进纸\\斜杠\'单引号\"双引号\xnn以十六进制代码nn表示的一个字符(其中n为0~F)。 例如,\x41表示A\unnnn以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符∑

这些字符可以出现在字符串中的任意位置,而且也将被作为一个字符解析,如:

var text = "This is the letter sigma: \u03a3."

这个离职中使用text.length 会输出28, 代表text有28个字符,其实6个字符是用来表示1个字符的,所以用length属性可能不会精确地返回字符串中的字符数目。


字符串的特点

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

如:

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

该示例执行过程如下:

  1. 创建一个能容纳10个字符串(JavaScript)的新字符串
  2. 在这个字符串中填充"Java"和“Script”
  3. 销毁会原来的字符串"Java"和"Script"

整个过程在后台发生,因此在某些旧版浏览器中拼接字符串速度慢的原因。


转换为字符串

要把一个值转换为字符串有两种方式:

  1. toString()方法 - 除了null和undefined值没有这个方法,String类型的调用后返回该string的一个副本
  2. String()转型函数 - 所有类型都适合
  3. 使用加号操作符 - 把它与一个字符串“”加在一起

多数情况下toString()方法不必传递参数,除非需要用传递一个参数指定是二进制、八进制、十进制或十六进制,默认十进制。如:

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

在不知道要转换的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串,转换规则如下:

  • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
  • 如果值是null,则返回"null"
  • 如果值是undefined, 则返回"undefined"
 

如何判断一个变量的数据类型?

使用typeof操作符(注意:typeof不是函数,只是操作符,这就意味着你使用时可不必像函数一样必须加括号)。

使用方式:

typeof checkObj;typeof(checkObj);

返回结果为如下一个字符串:
  • “undefined” - 声明但未定义的变量
  • “boolean” - 布尔值
  • “string” - 字符串
  • “number” - 数值
  • “object” - 对象或是null
  • “function” - 函数


示例:

console.log(typeof (unvarMsg)); // "undefined"console.log(typeof null); // "object"console.log(typeof 1); // "number"console.log(typeof 1 == "number"); // true

注意:

  • 在Safari 5、Chrome 7及两者之前版本,对正则表达式调用typeof操作符时会返回“function”,而其他浏览器则返回“object”
  • function(函数)在ECMAScript中是对象,不是一种数据类型,然而函数确实有一些特殊属性,因此使用typeof区分函数和对象还是有必要的