JavaScript 基本类型装换规则

/*************************************************************************************************************
* @第二章 在HTML 中使用Javascript
*/
<script> 标签属性
async 可选:表示当即下载脚本,但不妨碍页面中的其余操做,只对外部文件有效。
defer 可选:表示脚本能够延迟都文档彻底被解析和显示以后再执行,只对外部文件有效。
src 可选:表示包含要执行的外边文件。
type 可选:表示编写代码使用的脚本语言的内容类型。

不推荐使用的语法,会致使xhtml忽略该脚本。
<script>
<!--

-->
</script>

文档模式,若是没有文档声明会致使混杂模式。在某些特殊状况下会影响到js的解释执行。
<!doctype html>html

/******************************************************************************************************************
* @第三章 基本概念
*/chrome

ECMAScript 中的全部标识符(变量名,函数名,操做符)都区分大小写。async

标识符的第一个字符必须是字母、下划线、$符中的一个。函数

严格模式。
"use strict";指针

@变量
ECMAScript 中的变量都是松散类型的,能够保存任何类型的数据(基本类型和引用类型,变量名只是用来保存数据的占位符,变量名被声明以后能够随意改变类型)。
var num = 4;
num = "num";
num = null;htm

@数据类型
ECMAScript 分2中数据类型,分别是引用类型和基本类型。对象

@基本类型
基本类型包含 undefined, null, Boolean, Number, String;ip

@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,若是类型一致再对值进行比较。

相关文章
相关标签/搜索