ECMAScript 5种基本数据类型介绍、使用时注意事项及类型转换时需遵循的原则
来源:互联网 发布:恒久软件 义齿 编辑:程序博客网 时间:2024/06/15 20:39
ECMAScript 5种基本数据类型简介
ECMAScript中有5种基本数据类型,1种复杂数据类型,不支持任何创建自定义类型的机制,所有运算过程中的值最终都是其6种数据类型之一!
5种基本数据类型:
- Undefined
- Null
- Boolean
- Number
- 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种数值转换函数
- 任何数据类型转换为Number类型 - Number()函数
- 仅限字符串转Number类型 - parseInt()函数
- 仅限字符串转Number类型 - parseFloat()函数
Number()转换表
数据类型转化值Booleantrue - 1; false-0UndefinedNaNNullnull - 0String- 如果字符串中只包含数字,则转为十进制数值
- 如果字符串中包含有效的浮点格式,将转为对应的浮点数值
- 如果字符串中包含有效的十六进制格式,则转为对应的十进制数值
- 如果字符串是空(“”),则将其转化为0
- 如果包含除上述格式外的
示例:
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 类型用于表示由零或多个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";
该示例执行过程如下:
- 创建一个能容纳10个字符串(JavaScript)的新字符串
- 在这个字符串中填充"Java"和“Script”
- 销毁会原来的字符串"Java"和"Script"
整个过程在后台发生,因此在某些旧版浏览器中拼接字符串速度慢的原因。
转换为字符串
要把一个值转换为字符串有两种方式:
- toString()方法 - 除了null和undefined值没有这个方法,String类型的调用后返回该string的一个副本
- String()转型函数 - 所有类型都适合
- 使用加号操作符 - 把它与一个字符串“”加在一起
多数情况下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区分函数和对象还是有必要的
- ECMAScript 5种基本数据类型介绍、使用时注意事项及类型转换时需遵循的原则
- 创建数据表和使用字符串类型时赢遵循原则
- 优化时遵循的原则
- 强制类型转换使用时的注意事项
- 【C++注意事项】1 数据类型及类型转换
- 工作时应遵循的几个原则
- 算术编码时应遵循的原则
- 基本数据类型:8种基本类型、对应的包装类、引用数据类型及与String 之间的转换。
- C++基本数据类型及类型转换
- Java之基本数据类型及类型转换
- java基本数据类型及类型转换
- java八大基本数据类型及类型转换
- java基本数据类型及类型转换
- java基本数据类型及类型转换
- ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
- Unit5 基本类型数据类型转换与字符串的使用
- 数据类型转换及注意事项
- 介绍设计模式遵循的一般原则
- <context:component-scan>使用说明
- PyQt5学习笔记(1)
- Mybatis+Oracle批量插入(自动过滤重复数据)与删除
- [bzoj1191][二分图匹配]超级英雄Hero
- Android网络判断
- ECMAScript 5种基本数据类型介绍、使用时注意事项及类型转换时需遵循的原则
- js中如何快速获取数组中的最大值最小值以及取整
- 算法练习收藏
- C++之虚函数
- NET使用Mongodb入门示例
- 2018校招携程测评,赞RP
- 7614:最低通行费
- Matlab处理虹膜程序解析
- 静态变量 static