您所在的位置:小祥子 » 编程 » JavaScript » 正文

第三章 基本概念

时间:2015-08-11 编辑:fronter 来源:CnBlogs

ECMAScript中有5种简单数据类型:Undefined、Null、Boolean、Number和String,还有一种复杂的数据类型Object

typeof操作符

"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值;
"object"——如果这个值是对象或null;
"function"——如果这个值是函数。
调用typeof null会返回"object" 因为特殊值null会被认为是一个空的对象引用。

undefined

Undefined类型只有一个值,即undefined,在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined;
但是 var message;alert(message);会显示undefined 但是alert(age);未声明的变量会导致错误。
对于未声明的变量,只能执行typeof操作,但是对于未初始化的变量和未声明的变量使用typeof都会返回undefined。

null

Null类型也只有一个值null,null表示一个空指针对象,而这也正是typeof检测null值会返回"object"的原因
如果定义的变量准备字将来用于保存对象,最好将该变量初始化为null而不是其他值,这样只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用:
if(car!=null){
}
实际上,undefined值是派生自null值
alert(null==undefined); //true

Boolean

Boolean类型有true和false两个值,true不一定为1,false不一定为0.
Boolean类型的值区分大小写,也就是说,True和False都不是Boolean值,只是标示符。
ECMAScript所有类型的值都有与这两个Boolean值等价的值,使用Boolean()调用转型函数
数据类型 转化为true 转化为false
Boolean true false
String 非空字符串 "" 空字符串
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined n/a(不适用) undefined

Number

Number类型
八进制第一位必须是0如果超出范围则前面的0会被忽略当做十进制解析
var a = 070;//八进制的56
var a = 079;/无效的八进制数值——解析为79
var a = 08; //无效的八进制数值——解析为8
八进制字面量在严格模式下是无效的,会导致JavaScript引擎抛出错误
十六进制字面值前两位必须是0x
进行计算时,所有八进制和十六进制的数值都将被转换成十进制数值。

浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转换为整数值。即1. ,和10.0 这样的数会被转换为整数。
可以使用科学计数法 3.12e7 即31200000
浮点数的最高精度是17位小数,但精度不如整数0.1+0.2=0.30000000000000004,这个误差会导致无法测试特定的浮点数值。所以不要这样做if(a+b==0.3){} 永远不要测试某个特定的浮点数值。

Number.MAX_VALUE=1.7976931348623157e+308 Number.MIN_VALUE=5e-324超过范围会被转化为-Infinity和Infinity
正负无穷不能参与计算。判断一个数值是不是有穷的用isFinite()函数。
Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY 保存着-Infinity和Infinity

NaN表示一个本来要返回数值的操作数为返回数值的情况,ECMAScript中0/0会返回NaN,正数除以0返回Infinity,负数除以0返回 -Infinity;涉及NaN的操作(比如NaN/10)都会返回NaN,NaN与任何值都不相等包括NaN本身。
alert(NaN==NaN);//false
isNaN()判断是否“不是数值”
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false(可以被转换成数值10)
alert(isNaN("blue")); //true(不能被转换为数值)
alert(isNaN(true)); //false (可以被转换成数值1)
isNaN()确实也使用于对象,在基于对象调用isNaN()时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toSting() 方法,再测试返回值,这个过程也是ECMAScript种内置函数和操作符的一般执行过程。

数值转换

Number()用于任何数据类型,parseInt()和parseFloat()用于把字符串转换成数值,这3个函数对于同样的输入会有返回不同的结果。
Number()函数的转换规则
如果是Boolean值,true和false分别被转换为1和0;
如果是数字值,只是简单的传入和返回。
如果是null值,返回0;
如果是undefined,返回NaN。
如果是对象,会首先调用对象的valueOf()方法,然后按照上面的规则转换,如果结果是NaN,则基于这个返回值再调用toSting() 方法,再转换。
如果是字符串,遵循下列规则:
如果字符串中只包含数字,则将其转换为十进制数值,即”1“变成1,”123“变为123,”011“变为11(前面的0忽略);
如果包含有效的浮点格式如”1.1“则将其转换为对应的浮点数值(前面的0忽略);
如果包含十六进制如”0xf“,会转换为相同大小的十进制整数;
如果是空的,返回0;
如果包含除上述格式外的其他字符,转换为NaN。
parseInt()函数会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()会返回NaN。parseInt("123lue");//123 parseInt("");//NaN parseInt("oxA"); //10(十六进制) parseInt("11.1");//11
可以使用parseInt("0xf",16);指定基数为16 可以这样parseInt("f",16);//15
parseFloat()字符串的第一个小数点是有效的,第二个是无效的。会忽略前面的0,只解析十进制值,十六进制的字符串会被转换成0.

String类型

单双引号完全相同。
\n \t \b \xnn \unnnn 会被当做一个字符来解析
字符串是不可变的
转化为字符串:数值、布尔值、对象、字符串都有toString()方法,但null和undefined没有,多数情况下,调用toString()方法不必传递参数,但是在调用数值的toString()方法时可以传递。默认以十进制格式返回。num.toString(2); 以二进制返回
String()可以转化任何类型的值,规则:
如果有toString()方法,则调用该方法(无参数)并返回相应的结果;
如果是null,则返回"null";
如果是undefined,则返回"undefined";
Object类型具有如下属性和方法:
constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数就是Object();
hasOwnProperty(propertyName):用于检查给定的属性在当前对象的实例中(而不是在实例的原型中)是否存在。
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型;
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举;
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

操作符

++、--不仅适用于整数,还适用于字符串、布尔值、浮点数值和对象
var s1 ="2" s1++ //变成3,对于包含有效数字字符的字符串,先转化为数字再执行加减1
var s2="a" s1++//NaN 不包含有效数字字符的字符串
var b="false" b++//1 false转化为0,true为1;

一元加放在数值前面对数值不会产生任何影响,一元减会将数值变为负

短路操作&&找出第一个为false的值,否则放回最后一个数; ||找出第一个为true的值,否则返回最后一个数。

乘法

有一个为NaN 返回NaN;
Infinity与0相乘,为NaN;
Infinity与非0相乘,结果为Infinity或-Infinity;
Infinity与Infinity相乘,为Infinity;
如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则

除法

有一个为NaN,结果为NaN;
Infinity被Infinity除,结果为NaN;
0被0除,NaN;
非零的有限数被0除,结果是Infinity或-Infinity;
Infinity被任何非0除,结果是Infinity或-Infinity;
如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则

求模

被除数是无穷大而除数是有限大的数值,NaN;
被除数是优先打除数是0,NaN;
Infinity被Infinity除,NaN;
被除数是有限大的数值而除数是无限大的数值,结果是被除数;
被除数是0,结果是0;
如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则;

加法

Infinity加-Infinity 结果是NaN;
两个都是字符串,则拼接起来,一个是字符串,将另一个转换为字符串再拼接起来
有一个是对象、数值、或布尔值,则调用他们的toString()方法取得相应的字符串,再使用前面的规则,对于undefined和null,则分别调用String()取得字符串"undefined"和"null"

减法

一个操作数为NaN,结果是NaN;
Infinity减Infinity,结果是NaN;
-Infinity减-Infinity,结果是NaN;

相等操作符

如果一个操作数的布尔值,先false转换为0,true转换为1;
一个是字符串,另一个是数值,现将字符串转换为数值;
如果一个操作数是对象,另一个不是,调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
null和undefined相等;
比较相等前,不能将null和undefined转换成其他任何值;
如果一个操作数是NaN,==返回false,!=返回true。两个操作数都是NaN,==返回false;
两个操作数都是对象,则比较他们是不是同一个对象,指向同一个对象,==返回true,否则,返回false;
===在未经转换就相等的情况下返回true。
null==undefined //true null===undefined //false

switch比较值的时候使用的是===操作符因此不会发生类型转换

arguments对象的值永远与对应命名参数的值保持同步。
function doAdd(num1,num2){
arguments[1] = 10;
alert(arguments[0]+num2);
}
也就是说num2的值也会变成10。但是arguments[1]和num2不是访问相同的内存空间,它们的内存空间是独立的,但它们的值会同步。如果只传入了一个参数,那么为arguments[1]设置的值不会反映到命名参数中。arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。没有传递值的命名参数将自动被赋予undefined值,这就跟定义变量没初始化一样。即doAdd()函数传递了一个参数,num2中就会保存undefined值。在严格模式下,前面例子里的赋值无效。ECMAScript中所有参数传递的都是值,不能通过引用传递参数。

ECMAScript没有重载,后面的会覆盖前面的,通过检查参数,可以模仿重载。

关键词: