JavaScript 基本类型装换规则
/*************************************************************************************************************
* @第二章 在HTML 中使用Javascript
*/
<script> 标签属性
async 可选:表示立即下载脚本,但不妨碍页面中的其他操作,只对外部文件有效。
defer 可选:表示脚本可以延迟都文档完全被解析和显示之后再执行,只对外部文件有效。
src 可选:表示包含要执行的外边文件。
type 可选:表示编写代码使用的脚本语言的内容类型。
不推荐使用的语法,会导致xhtml忽略该脚本。
<script>
<!--
-->
</script>
文档模式,如果没有文档声明会导致混杂模式。在某些特殊情况下会影响到js的解释执行。
<!doctype html>
/******************************************************************************************************************
* @第三章 基本概念
*/
ECMAScript 中的所有标识符(变量名,函数名,操作符)都区分大小写。
标识符的第一个字符必须是字母、下划线、$符中的一个。
严格模式。
"use strict";
@变量
ECMAScript 中的变量都是松散类型的,可以保存任何类型的数据(基本类型和引用类型,变量名只是用来保存数据的占位符,变量名被声明之后可以随意改变类型)。
var num = 4;
num = "num";
num = null;
@数据类型
ECMAScript 分2中数据类型,分别是引用类型和基本类型。
@基本类型
基本类型包含 undefined, null, Boolean, Number, String;
@typeof 操作符
typeof 操作符用来检测基本类型数据,返回一个字符串,对null进行操作是 safari5 chrome7 之前的版本会返回 "object"
"undefined" ---如果这个值未定义;
"boolean" ---如果这个值是布尔值;
"string" ---如果这个值是字符串;
"number" ---如果这个值是数值;
"object" ---如果这个值是对象或者null;
"function" ---如果这个值是函数;
@undefined 类型
undefined 表示声明变量但是未初始化,不过undefined 值的变量和尚未定义的变量是不一样的。
var message;
alert(message); //"undefined"
alert(num); //报错
@null 类型
null 表示一个空对象的指针,这也是使用typeof 操作符会返回 "object"的原因。
如果定义的变量准备在将来保存对象,那么最好使用null初始化,而不是其他值。
@number 类型
number 类型表示数字类型,ECMAScript 使用IEEE754格式来表示整数和浮点数。
1.浮点数,所谓浮点数就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。浮点数需要的内存空间是整数类型的2倍。
所以ECMAScript 会不失时机的将浮点数转为整数。 如下所示:
var floo = 10.00 //整数---解析为10
2.数值范围 ECMAScript 中表示最小值保存在 Number.MIN_VALUE, 最大值保存在 Number.MAX_VALUE中。
超过这2个值就是 Infinity(正无穷) -Infinity(负无穷), 对于是否是有效数字使用isFinite()函数,如果值在最大值和最小值之间返回true;
3.NaN 非数值是一个特殊的数值。这个数值表示本来要返回数值的操作数未返回数值的情况。 ECMAScript 中 任何数值 / 0都返回 NaN;
NaN有2个特点: 1.NaN 和任何数操作都会返回NaN ,2. NaN 和任何值都不相等,包括自己本身 (NaN != NaN)
ECMAScript 中定义了一个函数 isNaN(NaN), 该函数会将参数转换为数值 ,如果非数字返回true , 是数值返回false;
4. 数值转换
有3个函数可以把非数值转换为数值: Number(), parseInt(),parseFloat();
Number()转换规则如下:
true 和 false 转为 1 和 0;
如果是数字值,只是简单的传入传出,返回原值。
如果是null 值,返回0。
如果是undefined, 返回NaN。
如果是字符串按下列规则。
如果字符串只包含数值,将其转换为十进制,返回该数值。"+123"返回123,"-12"返回-12, "0122"返回122 前导零被忽略了。
如果字符串包含有效的浮点格式,"012.1" 返回12.1 前导零被忽略。
如果字符串包含有效的十六进制格式。则将其转为相同大小的十进制数值。如"0xa" 返回10。
如果字符串是空的,则返回0。
如果字符串包含处上述以外的字符,返回NaN 如 "aew12" 返回NaN。
如果是对象,则调用对象的valueOf()方法,然后按上述规则返回值。当没有valueOf() 方法的时候会调用toString()方法,再次按上述规则返回值。
parseInt()
parseInt() 转换字符串时,更多的是看其是否符合数值模式。他会忽略字符串前面的空格,直至找到第一个非空格字符。如果不是数字字符或者符号。
parseInt() 会返回NaN, 也就是说parseInt()转换空字符串会返回NaN。如果第一个字符包含数字,会解析到所有后续字符或遇到非数字字符为止。
"12ad1" 返回12。
parseInt(12,10) 第二个参数是以何种格式进行解析。如二进制,八进制,十进制,十六进制。
parseFloat()
也是从第一个非空格字符开始解析,会忽略前导零,遇到第一个非数字类型无效,第二个小数点包括后面的无效。parseFloat()只解析十进制。
@string 类型
ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能该改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后会用新的字符串填充该变量。
转换为字符串
要把一个值转换为字符串有两种方式一种就是使用几乎每个值都有的toString()方法。该方法返回相对应的字符串表现。如 true 返回 "true"
该函数可以传递参数控制以何种进制输出。默认按十进制。如 var a = 12; a.toString(16) 返回c;
*注意这里只对数值类型其作用,非数字如"12"会按原值输出。
要知道在ECMAScript 中 null 和 undefined 是没有方法的,所以使用 String()构造器方法转换。 如果是null 返回"null"。
@一元加减操作符
使用一元加减运算符会像Number()函数一样对这个值进行转换。
var s1 = +1, s2 = +'1.1', s3 = +'z';
s1 返回 1, s2 返回 1.1 , s3 返回 NaN;
@布尔操作符
1.逻辑非
逻辑非操作符由一个(!)表示,可以应用于ECMAScript 中的任何值。无论这个值是什么类型都会返回一个布尔值。然后在对其取反。规则如下。
如果操作数是一个对象,返回true然后对其取反,返回false;下面规则一样,所以简写最终返回结果。
如果操作数是一个空字符串,返回true;
如果操作数是一个非空字符串,返回false;
如果操作数是数值0,返回true;
如果操作数是任意非0的数值(包含Infinity)返回false;
如果操作数是null,返回true;
如果操作数是NaN,返回true;
如果操作数是undefined ,返回true;
2.逻辑与
逻辑与操作符由两个(&&)符号表示,有2个操作数。可以操作任何值,当操作在不是布尔类型,逻辑与不一定返回布尔值,按如下规则。
如果第一个操作数是对象,则返回第二个操作数。
如果两个操作数都是对象,则返回第二个操作数,即第二个对象。
如果第二个操作数是对象,则在第一个操作数的求值为true 的情况下返回该对象,否则返回第一个操作数(不一定是false 例如 null && {} 返回 null)。
如果有一个操作数是null,则返回null。
如果有一个操作数是undefined ,则返回undefined。
如果有一个操作数是 NaN ,则返回 NaN。
*注意如果操作数都是 undefined null NaN 则第一个操作数是哪个则返回哪个 例如 NaN && null 返回NaN;
*注意逻辑与是短路操作,即第一个操作数能求出就过那么不会对第二个操作数求值。例如:
alert(false && abc ) 这里打印了 false
alert(true && ABC ) 这里报错了,因为变量ABC未定义。
3.逻辑或
逻辑或操作符由两个(||)表示,有两个操作数。与逻辑与相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值,规则如下。
如果第一个操作数是false,则返回第二个操作数。
如果第一个操作数是对象,则返回第一个操作数。
如果两个操作数都是对象,则返回第一个操作数。
如果两个操作数都是 null undefined NaN 对象 其中的一个返回第一个操作数。
*逻辑与也是短路操作,及第一个操作数返回true 那么就不会对第二个操作数求值了。
@乘性运算符
ECMAScript 定义了3个乘性运算符:乘法、除法和求模。在执行非数值运算的情况下会进行类型转换。如果参与乘性计算的某个操作数不是数值,后台会使用Number()函数对其进行转换数值操作。
1.乘法
乘法操作符用一个(*)表示,用于计算两个数值的乘积。如下所示:
var num = 10 * 21;
在处理特殊值的情况下,乘法运算符会遵循下列规则:
如果操作数都是数值,执行常规计算,两个数都是正数或者负数返回正数,有一个负数返回负数,如果乘积超过了ECMAScript数值的范围则返回 Infinity (正无穷)或 -Infinity;
如果一个数是NaN,则结果是NaN;
如果Infinity 与 0 相乘,则结果是NaN;
任何数值与0相乘,则结果是0;任何非数值与0相乘,则结果是 NaN;
如果Infinity 与非0数值相乘,则结果是Infinity 或 -Infinity ,如果与非数值类型相乘结果是NaN;
如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
如果一个操作数是对象先调用valueOf()方法,如果没有则调用toString()方法。在后台调用Number()将其转为数值。
如果操作数有一个不是数值,则在后台调用Number()将其转为数值,然后再应用上述规则。
2.除法
除法操作符用一个(/)表示,执行两个数的计算,如下所示:
var num = 99 / 9 ;
在处理特殊值的情况下,除法运算符与乘法运算符规则类似。
3.求模
求模操作符用一个(%)表示,执行两个数的计算,如下所示:
var num = 99 % 9 ;
在处理特殊值的情况下,求模运算符与乘法运算符规则类似。
@关系操作符 比较运算符。
小于、大于、小于等于、大于等于这几个关系操作符用于对两个值进行比较。这几个操作符都会返回布尔值。
与ECMAScript 中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作。规则如下:
如果两个操作数都是数值,则进行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的ascll码。
如果一个操作数是数值,则将另一个操作数转为数值,然后进行比较。如果一个值是 NaN 则返回 false;
如果操作数是对象,则调用该对象的valueOf()方法, 没有则调用 toString() 方法,然后在对其进行相应的操作。
如果一个操作数是布尔值,则将其转换为数值,再进行比较。
@相等运算符。
1.相等与不相等
ECMAScript 中的相等操作符由(==)表示,如果两个操作数相等则返回true。而不相等操作符由(!=)表示,如果两个操作数不相等,则返回true。
这两个操作符都会先转换操作数(强制转换),然后再比较他们的相等性。规则如下:
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值--false 转为0,而 true 转换为 1; 例如 alert(true >= false);
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转为数值;
如果一个操作数是对象,另一个不是,则先调用对象的valueOf()方法,没有则调用 toString(),然后将得到的值按前面的规则进行比较。
null 和 undefined 是相等的
要比较相等性之前,不能将null 和 undefined 转换为其他任何值。
如果有一个操作数是 NaN ,则相等操作符返回 false ,而不相等运算符返回 true ; *注意如果两个操作数都是 NaN 则相等运算符返回 false , NaN 不等于 NaN;
如果两个操作数都是对象,则比较他们是不是同一个对象, 如果两个操作数都指向了同一个对象。则相等运算符返回 true ,否则返回 false;
2.全等于全不等
除了在比较之前不做操作数转换之外,全等与全不等操作符和等于不等操作符没什么区别。全等运算符先判断类型,如果类型不一致返回false,如果类型一致再对值进行比较。