javaScript.docx
《javaScript.docx》由会员分享,可在线阅读,更多相关《javaScript.docx(41页珍藏版)》请在冰豆网上搜索。
javaScript
一.JavaScript的历史
a)1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)
b)Netscape接收Nombas的理念,(BrendanEich)在其NetscapeNavigator2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript
c)微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript.
d)为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳ECMAScript作为标准(ISO/IEC-16262)。
从此,Web浏览器就开始努力(虽然有着不同的程度的成功和失败)将ECMAScript作为JavaScript实现的基础。
EcmaScript是规范.
1.1,ECMAScript
尽管ECMAScript是一个重要的标准,但它并不是JavaScript唯一的部分,当然,也不是唯一被标准化的部分。
实际上,一个完整的JavaScript实现是由以下3个不同部分组成的:
∙核心(ECMAScript)
∙文档对象模型(DOM)Documentobjectmodel(整合js和html和css)
∙浏览器对象模型(BOM)Broswerobjectmodel(整合js和浏览器)
∙Javascript在开发中绝大多数情况是基于对象的.也是面向对象的.
1.2ECMAScript
Web浏览器对于ECMAScript来说是一个宿主环境,但它并不是唯一的宿主环境。
事实上,还有不计其数的其他各种环境(例如Nombas的ScriptEase,以及Macromedia同时用在Flash和DirectorMX中的ActionScript)可以容纳ECMAScript实现。
那么ECMAScript在浏览器之外规定了些什么呢?
简单地说,ECMAScript描述了以下内容:
∙语法
∙类型
∙语句
∙关键字
∙保留字
∙运算符
∙对象
二ECMAScript基础
2.1.ECMAScript语法
1.变量区分大小写
a>可一次声明多个变量,并且变量不必具有相同的类型.例如:
vartest="hi",age=25;
b>命名规范:
●第一个字符必须是字母、下划线(_)或美元符号($)
●余下的字符可以是下划线、美元符号或任何字母或数字字符
c>ECMAScript的解释程序遇到未声明过的标识符时,用该变量名创建一个全局变量,并将其初始化为指定的值。
这是该语言的便利之处,不过如果不能紧密跟踪变量,这样做也很危险。
最好的习惯是像使用其他程序设计语言一样,总是声明所有变量。
2.变量是弱类型的
3.每行的分号可有可无.没有就按折行符的末尾作为结尾.
4.注释与java,c,php相同
5.使用{}来封装代码块
6.变量声明不是必须的.
著名的变量命名规则(附录)
只是因为变量名的语法正确,并不意味着就该使用它们。
变量还应遵守以下某条著名的命名规则:
Camel标记法
首字母是小写的,接下来的字母都以大写字符开头。
例如:
varmyTestValue=0,mySecondValue="hi";
Pascal标记法
首字母是大写的,接下来的字母都以大写字符开头。
例如:
VarMyTestValue=0,MySecondValue="hi";
匈牙利类型标记法
在以Pascal标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。
例如,i表示整数,s表示字符串,如下所示“
VariMyTestValue=0,sMySecondValue="hi";
---------------------------------------------------------
数组
a
aValues
布尔型
b
bFound
浮点型(数字)
f
fValue
函数
fn
fnMethod
整型(数字)
i
iValue
对象
o
oType
正则表达式
re
rePattern
字符串
s
sValue
变型(可以是任何类型)
v
vValue
2.2原始值和引用值
在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值。
原始值
存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
引用值
存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
5种原始值类型如下:
●Undefined、
●Null、
●Boolean、
●Number
●String
在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。
ECMAScript打破了这一传统。
Undefined类型
Undefined类型只有一个值,即undefined。
当声明的变量未初始化时,该变量的默认值是undefined。
当函数无明确返回值时,返回的也是值"undefined";
Null类型
另一种只有一个值的类型是Null,它只有一个专用值null,即它的字面量。
值undefined实际上是从值null派生来的,因此ECMAScript把它们定义为相等的。
尽管这两个值相等,但它们的含义不同。
undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示尚未存在的对象(在讨论typeof运算符时,简单地介绍过这一点)。
如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。
Boolean类型
Boolean类型是ECMAScript中最常用的类型之一。
它有两个值true和false(即两个Boolean字面量)。
即使false不等于0,0也可以在必要时被转换成false.
Number类型
ECMA-262中定义的最特殊的类型是Number类型。
这种类型既可以表示32位的整数,还可以表示64位的浮点数。
●定义十进制整数variNum=86;
●定义八进制variNum=070;(了解)
●定义十六进制variNum=0xAB;(了解)
●科学计数法varfNum=5.618e7;varfNum=8-e17(了解)
●定义浮点数varfNum=5.0;
对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。
●数字的最大值:
Number.MAX_VALUE
●数字的最小值:
Number.MIN_VALUE
●超过最大值:
Number.POSITIVE_INFINITY(不可参与运算)
●小于最小值:
Number.NEGATIVE_INFINITY(不可参与运算)
●特殊值:
NaN(NotANumber).一般说来,这种情况发生在类型(String、Boolean等)转换失败时。
NaN不等于NaN,可以使用isNaN()方法.
String类型
它是唯一没有固定大小的原始类型。
声明时可以使用单引号或者双引号.因为没有字符类型.
typeof运算符
ECMAScript提供了typeof运算符来判断一个值是否在某种类型的范围内。
可以用这种运算符判断一个值是否表示一种原始类型:
如果它是原始类型,还可以判断它表示哪种原始类型。
对变量或值调用typeof运算符将返回下列值之一:
●undefined-如果变量是Undefined类型的
●boolean-如果变量是Boolean类型的
●number-如果变量是Number类型的
●string-如果变量是String类型的
●object-如果变量是一种引用类型或Null类型的
注释:
您也许会问,为什么typeof运算符对于null值会返回"Object"。
这实际上是JavaScript最初实现中的一个错误,然后被ECMAScript沿用了。
现在,null被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
三ECMAScript语句
if语句
if语句是ECMAScript中最常用的语句之一,事实上在许多计算机语言中都是如此。
if语句的语法:
if(condition)statement1elsestatement2
其中condition可以是任何表达式,计算的结果甚至不必是真正的boolean值,ECMAScript会把它转换成boolean值。
如果条件计算结果为true,则执行statement1;如果条件计算结果为false,则执行statement2。
还可以串联多个if语句。
就像这样:
if(condition1)statement1elseif(condition2)statement2elsestatement3
do-while语句
do-while语句是后测试循环,即退出条件在执行循环内部的代码之后计算。
这意味着在计算表达式之前,至少会执行循环主体一次。
它的语法如下:
do{statement}while(expression);
while语句
while语句是前测试循环。
这意味着退出条件是在执行循环内部的代码之前计算的。
因此,循环主体可能根本不被执行。
它的语法如下:
while(expression)statement
for语句
for语句是前测试循环,而且在进入循环之前,能够初始化变量,并定义循环后要执行的代码。
它的语法如下:
for(initialization;expression;post-loop-expression)statement
switch语句
switch语句是if语句的兄弟语句。
开发者可以用switch语句为表达式提供一系列的情况(case)。
switch语句的语法:
switch(expression)
casevalue:
statement;
break;
casevalue:
statement;
break;
casevalue:
statement;
break;
casevalue:
statement;
break;
...
casevalue:
statement;
break;
default:
statement;
每个情况(case)都是表示“如果expression等于value,就执行statement”。
关键字break会使代码跳出switch语句。
如果没有关键字break,代码执行就会继续进入下一个case。
关键字default说明了表达式的结果不等于任何一种情况时的操作(事实上,它相对于else从句)。
四ECMAScript运算符
4.1ECMAScript一元运算符
void(函数后讲解)
void运算符对任何值返回undefined。
该运算符通常用于避免输出不应该输出的值,例如,从HTML的元素调用JavaScript函数时。
要正确做到这一点,函数不能返回有效值,否则浏览器将清空页面,只显示函数的结果。
例如:
window.open('about:
blank')">Clickme
如果把这行代码放入HTML页面,点击其中的链接,即可看到屏幕上显示"[object]"。
这是因为window.open()方法返回了新打开的窗口的引用。
然后该对象将被转换成要显示的字符串。
要避免这种效果,可以用void运算符调用window.open()函数:
void(window.open('about:
blank'))">Clickme
这使window.open()调用返回undefined,它不是有效值,不会显示在浏览器窗口中。
提示:
请记住,没有返回值的函数真正返回的都是undefined。
4.2i++,i--,++i,--i(跟java中一模一样)
vari=1;
Alert(i++);//1
Alert(++i);//3
Alert(i--);//3
Alert(--1);//1
4.3一元加法,一元减法(了解)
一元加法本质上对数字无任何影响:
variNum=20;
iNum=+iNum;
alert(iNum);//输出"20"
尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。
varsNum="20";
alert(typeofsNum);//输出"string"
variNum=+sNum;
alert(typeofiNum);//输出"number"
这段代码把字符串"20"转换成真正的数字。
当一元加法运算符对字符串进行操作时,它计算字符串的方式与parseInt()相似,主要的不同是只有对以"0x"开头的字符串(表示十六进制数字),一元运算符才能把它转换成十进制的值。
因此,用一元加法转换"010",得到的总是10,而"0xB"将被转换成11。
4.4ECMAScript位运算符(了解)跟java一模一样.
4.4.1位运算NOT~
位运算NOT由否定号(~)表示,位运算NOT实质上是对数字求负,然后减1,因此25变-26。
variNum1=25;//25等于00000000000000000000000000011001
variNum2=~iNum1;//转换为111111*********11111111111100110
alert(iNum2);//输出"-26"
还可以使用下面的方式:
variNum1=25;
variNum2=-iNum1-1;
alert(iNum2);//输出-26
4.4.2位运算AND&
variResult=25&3;
alert(iResult);//输出"1"
为什么得到这个结果?
25=00000000000000000000000000011001
3=00000000000000000000000000000011
---------------------------------------------
AND=00000000000000000000000000000001
4.4.3位运算OR|
variResult=25|3;
alert(iResult);//输出"27"
为什么得到这个结果?
25=00000000000000000000000000011001
3=00000000000000000000000000000011
--------------------------------------------
OR=00000000000000000000000000011011
4.4.4位运算XOR
variResult=25^3;
alert(iResult);//输出"26"
为什么得到这个结果?
25=00000000000000000000000000011001
3=00000000000000000000000000000011
---------------------------------------------
XOR=00000000000000000000000000011010
左移(<<)右移(>>)无符号右移(>>>)(了解)
4.4.5ECMAScript逻辑运算符(重要)
逻辑NOT运算符(!
)
∙如果运算数是对象,返回false
∙如果运算数是数字0,返回true
∙如果运算数是0以外的任何数字,返回false
∙如果运算数是null,返回true
∙如果运算数是NaN,返回true
∙如果运算数是undefined,返回true
逻辑AND运算符(&&)
逻辑AND运算的运算数可以是任何类型的,不止是Boolean值。
如果某个运算数不是原始的Boolean型值,逻辑AND运算并不一定返回Boolean值:
∙如果一个运算数是对象,另一个是Boolean值,返回该对象。
∙如果两个运算数都是对象,返回第二个对象。
∙如果某个运算数是null,返回null。
∙如果某个运算数是NaN,返回NaN。
∙如果某个运算数是undefined,返回undefined。
∙//1false&&o==>false
∙//2true&&o==>o==>true
∙//3o&&true==>true
∙//4o&&false==>false
∙//5o1&&o2==>
∙//6null&&true==>null
∙//7NaN&&true==>NaN
∙//8NaN&&null==>NaN
∙//9null&&NaN==>null
∙
∙//10undefined&&true==>undefined
∙//11false&&undefined==>false
逻辑OR运算符(||)
与逻辑AND运算符相似,如果某个运算数不是Boolean值,逻辑OR运算并不一定返回Boolean值:
∙如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象。
∙如果两个运算数都是对象,返回第一个对象。
∙如果最后一个运算数是null,并且其他运算数值均为false,则返回null。
∙如果最后一个运算数是NaN,并且其他运算数值均为false,则返回NaN。
∙如果某个运算数是undefined,返回undefined。
∙//1false||o==>o
∙//2true||o==>true
∙//3o||false==>o
∙//4o||true==>o
∙//5o1||o2==>o1
∙//6null||false==>false
∙//7null||true==>true
∙//8null||undefined==>undefined
∙//9undefined||null==>null
4.4.6数学运算符
+-*/%
Vara=“1”+”1”;//”11”
Varb=“1”+1;//2
4.4.7ECMAScript关系运算符(重要)
varbResult="Blue"<"alpha";
alert(bResult);//输出true
在上面的例子中,字符串"Blue"小于"alpha",因为字母B的字符代码是66,字母a的字符代码是97。
比较数字和字符串
另一种棘手的状况发生在比较两个字符串形式的数字时,比如:
varbResult="25"<"3";
alert(bResult);//输出"true"
上面这段代码比较的是字符串"25"和"3"。
两个运算数都是字符串,所以比较的是它们的字符代码("2"的字符代码是50,"3"的字符代码是51)。
不过,如果把某个运算数该为数字,那么结果就有趣了:
varbResult="25"<3;
alert(bResult);//输出"false"
这里,字符串"25"将被转换成数字25,然后与数字3进行比较,结果不出所料。
4.4.8ECMAScript等性运算符
执行类型转换的规则如下:
∙如果一个运算数是Boolean值,在检查相等性之前,把它转换成数字值。
false转换成0,true为1。
∙如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
∙如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
∙如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:
∙值null和undefined相等。
∙在检查相等性时,不能把null和undefined转换成其他值。
∙如果某个运算数是NaN,等号将返回false,非等号将返回true。
∙如果两个运算数都是对象,那么比较的是它们的引用值。
如果两个运算数指向同一对象,那么等号返回true,否则两个运算数不等。
全等号和非全等号
等号和非等号的同类运算符是全等号和非全等号。
这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
4.4.9ECMAScript条件运算符(三元运算符)(跟java中一模一样)
variable=boolean_expression?
true_value:
false_value;
4.4.10ECMAScript赋值运算符
∙乘法/赋值(*=)
∙除法/赋值(/=)
∙取模/赋值(%=)
∙加法/赋值(+=)
∙减法/赋值(-=)
variNum=10;
iNum=iNum+10;
等同于
variNum=10;
iNum+=10;
五ECMA对象
ECMAScript引用类型
从传统意义上来说,ECMAScript并不真正具有类。
事实上,除了说明不存在类,在ECMA-262中根本没有出现“类”这个词。
ECMAScript定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
varo=newObject();
对象分类
1.由ECMAScript定义的本地对象.独立于宿主环境的ECMAScript实现提供的对象.(nativeobject)
2.ECMAScript