void(window.open(‘about:
blank’))”>ClickMe
对于前后增量运算符,就是在数值上加1,对于前后减量,就是在数值减-1;
对于一元加法和一元减法,本质上对数字无任何影响,但会把字符串转换成数字。
位运算符:
--以二进制数字进行运算
1重温整数。
ECMAScript整数有两种类型,即有符号整数(允许用整数和负数)和无符号整数(只允许用整数)。
在ECMAScript中,所有整数字面量默认都是有符号整数。
有符号整数使用前31位表示整数的数值,用第32为表示整数的符号,0表示正数,1表示负数。
数值的范围从-2147483648到2147483647。
VariNum=10;
Alert(iNum.toString
(2));//outputs”10010”
负数也存储为二进制代码,不过采用的形式是二进制补码。
计算数字二进制补码的步骤有三步:
1确定该数字的非负版本的二进制表示。
2求得二进制反码,即要把0替换为1,把1替换为0;
3在二进制反码上加1;
注意:
有趣的是,ECMAScript并不以二进制补码的形式显示,而是用数字绝对值的标准的二进制代码前加负号的形式输出。
--ECMAScript的简单处理的方式。
VariNum=-18;
Alert(iNum.toString
(2));//outputs”-10010”
另一方面,无符号整数把最后一位作为另一个数位处理。
在这种模式中,第32位不表示数字的负号,而是值2的31幂。
无符号整数的数值范围为0到4294967295。
注意,所有整数字面量都默认存储有符号整数。
只有用ECMAScript的位运算符才能创建无符号整数。
位运算NOT(~),位运算NOT是三步的处理过程:
1把运算数转换成32为数字;
2把二进制形式转换成它的二进制反码。
3把二进制反码转换成运算数形式。
位运算NOT实质上是对数字求负,然后减1;
位运算AND(&),直接对运算数的二进制形式进行运算。
把它们的二进制数字对齐。
正正>正1、负负>负0;正负>负0、负正>负0;再把二进制数字转换成运算数形式。
位运算OR(|),直接对运算数的二进制形式进行运算。
把它们的二进制数字对齐。
正正>正1、负负>负0、正负>正1、负正>正1;再把二进制数字转换成运算数形式。
位运算XOR(^),直接对二进制数字进行运算。
当运算中的两个二进制数字,只有一个数位存的是1,它才返回1。
左移运算(”<<”),直接对运算数的二进制数字操作,如运算数2,的二进制数为00010,左移5位结果为64二进制中为1000000。
有符号右移运算(“>>”),将把32位数字中的所有数位整体右移,同时保留该数的符号。
有符号右移运算恰好与左移运算相反。
无符号右移运算(>>>),对于整数的操作与有符号右移运算一样,对于负数有所不同。
(无符号不存在负数)。
VariUnsigned64=-64>>>0;
Alert(iUnsigned64.toString
(2));----outputs”111111*********1111111110000000”,即由符号整数-64的二进制补码表示,不过它的等于无符号整数4294967232。
出于这种原因。
使用无符号右移运算符要小心。
Boolean运算符:
--运算的结果为boolean值
Boolean运算符有三种,逻辑NOT(!
)、逻辑AND(&&)和OR(||).
逻辑NOT运算符的行为如下:
1如果运算数是对象,返回false
2如果运算数是数字0,返回true
3如果运算数是0以外的数字,返回false
4如果运算数是null,返回true
5如果运算数是NaN,返回true
6如果运算数是undefined,发生错误。
逻辑AND运算并不一定返回Boolean值:
1如果一个运算数是对象,另一个是Boolean值,返回该对象。
2如果两个运算数都是对象,返回第二个对象。
3如果某个运算数是null,返回null
4如果某个运算数是NaN,返回NaN
5如果某个运算数是undefined,发生错误。
逻辑OR(||)的运算行为与AND的差异是:
1如果两个运算数都是对象,返回第一个对象。
2如果第一个运算数为true,就不再计算第二个运算数。
乘性运算符:
乘(*)除(/)(%)
加性运算符:
加(+)减(-)
关系运算符:
小于<、大于>、小于等于<=、大于等于>=
等性运算符:
判断两个变量是否相等是程序设计中非常重要的运算。
在处理原始值时,这种运算相当简单。
但涉及对象,任务就稍有点复杂。
ECMAScript提供了两套运算符处理这个问题,等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
对于等号(==)和非等号(!
=),操作原始值。
执行类型转换的基本规则如下:
1如果一个运算数是Boolean值,在检查相等性之前,把转换成数字值,false转换为0,true转换成1,。
2如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
3如果一个运算数是对象,另一个字符串,在检查相等性之前,要尝试把对象转换成字符串。
4如果一个运算数是对象,另一个数字,在检查相等性之前,要尝试把对象转换成数字。
对于全等号和非全等号在比较时,不尝试进行任何类型转换。
条件运算符:
Variable=boolean_expression?
Ture_value:
false_value;
赋值运算符:
简单的赋值运算(=)。
VariNum=10;iNum=iNum+10;等价于:
VariNum=10;iNum+=10;
函数:
要执行的标示
函数是一组可以随时随地运行的语句,函数是由关键字function、函数名加一组参数以及置于括号中要执行的代码声明的。
方法定义:
Functionsay(sName,sMessage){alert(“Hello”+name”,”+sMessage);}
方法调用:
Say(“nusss“,”howareyoutoday?
”)
函数say()未声明返回值,不过不必专门声明它。
同样的,即使函数确实有返回值,也不必明确地声明它。
该函数只需要使用return。
另一个重要的概念是,函数在执行过return语句后停止执行代码。
一个函数中可以有多个return语句。
Functiondiff(iNum1,iNum2){
If(iNum1>iNum2){returniNum1-iNum2;}
Else{returniNum2-iNum1;}
}
如果函数无返回值,那么可以调用没有参数的return运算符,随时推出函数。
无重载:
ECMAScript可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。
如:
FunctiondoAdd(iNum){alert(iNum+100);}
FunctiondoAdd(iNum){alert(iNum+10);}
doAdd(10);//outputs”20”;
arguments对象:
在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能方位它们。
还可用arguments对象检测专递给函数的参数个数,引用属性arguments.length即可。
那么如果把方法的参数看对一个对象,这个对象就用arguments来表示。
与其他程序设计语言不同,ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。
用arguments对象判断传递给函数的参数个数,即可模拟函数重载:
FunctiondoAdd(){
If(arguments.length==1){alert(arguments[0]+10);
}elseif(arguments.length==2){alert(arguments[0]+arguments[1]);}
}
doAdd(10);
doAdd(30,20);
Function类:
ECMAScript最令人感兴趣的可能莫过于函数实际上是功能完整的对象。
Function类可以表示开发者定义的任何函数。
如果函数看成一个对象的话,那么这个对象的名字为Function。
用Function类直接创建函数的语法如下:
Varfunction_name=newFunction(argument1…,argumentN,function_body);
doAdd=newFunction(“iNum”,”alert(iNum+100)”);
doAdd=newFunction(“iNum”,”alert(iNum+10)”);
doAdd(10);
观察这段代码,很显然,doAdd的值被改成了指向不同对象的指针。
函数名只是指向函数对象的引用值,行为就像其他指针一样。
甚至可以使两个变量指向同一个函数:
VardoAdd=newFunction(“iNum”,”alert(iNum+10)”);
VaralsoDoAdd=doAdd;
doAdd(10);//outputs:
20
alsoDoAdd(10);//outputs:
20
对象基础:
介绍过一切都是对象的概念。
本章的重点是如何操作以及使用这些对象,以及如何创建自己的对象,以根据需要增加专用的功能。
每个对象都由类定义,可以把类看作对象的配方。
类不仅要定义对象的接口,还要定义对象的内部工作。
编译器和解释程序都根据类的说明构建对象。
程序使用类创建对象时,生成的对象叫做类的实例。
对类生成的对象的个数的唯一限制来自于运行代码的机器的物理内存。
每个实例的行为相同,但实例处理一组独立的数据。
对象定义存放在一个函数---构造函数中。
构造函数不是一种特殊函数,它只不过是用于创建对象的常规函数。
面向对象语言的要求:
一种面向对象语言需要想开发者提供四种基本能力:
1封装—把相关的信息(无论数据或方法)存储在对象中的能力
2聚集—把一个对象存储在另一个对象内的能力
3继承—由另一个类(或多个类)得来类的属性和方法的能力。
4多态—编写能以多种方法运行的函数或方法的能力。
在ECMAScript中,对象由特性构成,特性可以是原始值,也可以是引用值。
如果特性存放的是函数,它将被看作对象的方法,否则该特性被看作属性。
对象应用:
1声明和实例化对象是用关键字new后跟要实例化的类的名字创建的:
VaroObject=newObject();
VaroStringObject=newString();
第一行代码创建了Object类的一个实例,并把它存储在变量oObject中。
第二行代码创建了String类的一个实例,把它存储在变量oStringObject中。
如果构造函数无参数,括号则不是必需的。
VaroObject=newObject;//实例化Object对象,且将对象存放在oObject中。
对象引用:
在ECMAScript中,不能访问对象的物理表示,只能访问对象的引用。
每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身。
对象废除:
把对象的所有引用都设置为null,可以强制性的废除对象。
早绑定和晚绑定:
所谓绑定,即把对象的接口与对象实例结合在一起的方法。
早绑定是指在实例化对象之前定义它的特性和方法,这样编译器或解释器程序就能提前转换机器代码。
另一方面,晚绑定指的是编译器或解释器程序在运行前,不知道对象的类型。
使用晚绑定,无需检查对象的类型,只需要检查对象是否支持特性和方法即可。
ECMAScript中的所有变量都采用晚绑定方法,这样就允许执行大量的对象操作。
对象的类型:
在ECMAScript中,所有对象并非同等创建的。
一般说来,可以创建并使用的对象有三种:
[本地对象、内置对象、宿主对象]
一:
本地对象,独立于宿主环境的ECMAScript实现提供的对象。
简单说来,本地对象就是ECMA-262定义的类(引用类型)
ArraystringdatenumberregexpreferenceError…….
Array类:
使用这两个方法,一点要使用括号:
VaraColors=newArray();
aColors[0]=“red”;
aColors[1]=“green”;
aColors[2]=“blue”;
这里创建了一个数组,并定于了三个数组项。
每增加一个数组项,数组的大小就动态地增长。
VaraColors=newArray(“red”,”green”,”blue”);
数组可以根据需要增大或减少。
最多可以存放4294967295项。
Function的toString()方法返回以字符串形式该方法内容。
Array对象覆盖了toString()方法和valueOf()方法,返回特殊的字符串。
Date类:
Aard=newDate();
toDateString()—以实现的特定的格式显示Date的日期部分;
toTimeString()—以实现的特点的格式显示Date的时间部分;
toLocalString()—以地点特点的格式显示Date的日期和时间;
内置对象:
由ESMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。
只定义两个内置对象,即Global和Math(它们也是本地对象,根据定义,每个内置对象都是本地对象)。
Global对象:
Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在。
如果尝试编写下面的代码,讲得到错误:
Varpointer=Global;
错误消息显示Global不是对象。
这里需要理解的主要概念是,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。
如isNaN()、isFinite()、parseInt()和parseFloat()等。
它们都是Global对象的方法。