js高程读书笔记(1-3章)
一、js简介
js是一种专为与网页交互而设计的脚本语言,由以下三个不同的部分组成:
1.ECMAScript,由ECMA-262(它规定了语言的这些组成部分:语法,类型,语句,关键字,保留字,操作符,对象)定义,提供核心语言功能;(ECMAScript就是对实现该标准ECMA-262规定的各个方面内容的语言的描述。)
2.文档对象模型(DOM)是针对XML但经过扩展用于HTML的应用程序编程接口。DOM把整个页面映射为一个多层节点结构。
如下面这个HTML页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>mytitle_Dom</title> </head> <body> <p>hello world!</p> </body> </html>
在DOM中,这个页面可以如1.1所示的分层节点图表示
3.浏览器对象模型(BOM),处理浏览器窗口和框架。
总而言之,理解下:
1.ECMAScript 是ECMA(欧洲计算机制造协会)注册的标准,除此之外还有微软的Jscript标准 和网景的JavaScript 标准。
2.dom和bom 都是JavaScript 中的宿主对象。
一般来说JavaScript 都指的是ECMAScript
二、在HTML中使用JS
2.1<script>元素
HTML4.01为<script>定义了下列5个属性。
1)charset:可选。表示通过src属性指定的代码的字符集,大多数浏览器会忽略这个值。
2)defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。
3)language:已废弃。原来用于表示编写代码使用的脚本语言,大多数浏览器会忽略这个值。
4)src:可选。表示包含要执行代码的外部文件。
5)type:必需。可以看成是language的替代属性;表示编写代码使用的脚本语言的内容类型(也成为MIME类型)。虽然text/javascript和text/ecmascript都已经不被推荐使用,但还是可以看到经常使用text/javascript。实际上,服务器在传送JS文件时使用的MIME类型通常是application/x-javascript,但在type中设置这个值却可能导致脚本被忽略。
2.1.1标签的位置
按照惯例,所有<script>元素都应该放在页面的<head>元素中,这种做法的目的是把所有外部文件(包含CSS文件和JavaScript文件)的引用都放在相同的地方。可是,在文档<head>元素中包含所有JavaScript文件,意味着必须等到全部JS代码都被下载,解析和执行完成以后,才能呈现页面的内容(浏览器遇到<body>标签才开始显示内容)。如果有很多JS代码要加载,那么会导致浏览器呈现明显的延迟,延迟期间,浏览器窗口将会是一片空白。为了避免这个问题:
①可将JS引用放在<body>元素中,放在页面的内容后面。
②延迟脚本,<script>标签定义了defer属性。这个属性的用途是表明脚本在执行时不会影响页面构造,也就是说,脚本会被延迟到整个页面都解析完毕后再运行。
2.1.2在XHTML中的用法
在HTML中,有特殊的规则则用以确定<script>元素中的哪些内容可以被解析,但这些特殊的规则在XHTML中不适用。如小于号("<")在XHTML中就需要用"<",不过可以用一个CData片段来包含JS代码
<script type="text/javascript"> <![CDATA[ function compare(a,b){} ]] </script>
三、基本概念
3.1变量
ECMAScript的变量是松散类型(可以用来保存任何类型的数据)的,每个变量仅仅是一个保存值的占位符而已。定义变量时用var操作符(var是一个关键字),后跟变量名(即一个标识符)。
注:在函数体内用var 定义的变量是局部变量,函数退出后就会被销毁。不过在函数体内定义的变量省略var操作符后,此变量就是全局变量,只要调用过一次函数,此变量就有了定义,在函数外部可以被访问到。
3.2数据类型
参见http://www.cnblogs.com/wj204/p/3402204.html
3.3操作符
①一元操作符:
递增和递减操作符:
var s1="2";
var s2="z";
var b=false;
var f=1.1;
var o={valueOf:function(){return -1;}};
s1++;//值变成数值3
s2++;//值变成NaN
b++;//值变成数值1
f--;//值变成0.100000000(由于浮点舍入错误所致)
o--;//值变成数值-2
一元加和减操作符:
var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
var o={valueOf:function(){return -1;}};
s11=+s1;//值变成数值1
s12=-s1;//值变成数值-1
s21=+s2;//值变成数值1.1
s22=-s2;//值变成数值-1.1
s31=+s3/-s3;//值变成NaN
b=+b/-b;//值变成了数值0
f11=+f;//值仍然是1.1
f12=-f;//值变成-1.1
o11=+o;//值变成数值-1
o12=-o;//值变成数值1
3.4函数
3.4.1理解参数
在ECMAScript中的参数在内部用一个数组来表示。在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。其实,arguments对象只是与数组类似,因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个元素是arguments[1])
function howManyArgs(){
alert(arguments.length);
}
howManyArgs("string",45); //2
howManyArgs); //0
howManyArgs(12); //1
与参数有关的方面:
①“重载”特性:
function doAdd(){
if(arguments.length==1){
alert(arguments[0]+10);
}else if(arguments.length==2){
alert(arguments[0]+arguments[1]);
}
}
doAdd(10); //20
doAdd(30,20);//50
②arguments对象可以与命名参数一起使用,如:
function doAdd(num1,num2){
if(arguments.length==1){
alert(num1+10);
}else if(arguments.length==2){
alert(arguments[0]+num2);
}
}
doAdd(10); //20
doAdd(30,20);//50
在重写后的这个doAdd()函数中,两个命名参数num1,num2都与arguments对象一起使用。由于num1的值与arguments[0]的值相同,因此它们可以互换使用。
注:没有传递值的命名参数将被自动赋予undefined值。这就跟定义了变量却没有初始化一样。(ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。)
3.4.2没有重载
如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数(前面定义的函数将无效)【要做到重载可以跟3.4.1.①一样,通过检查函数中参数的类型和数量并作出不同的反应,这模仿了方法的重载】
小结:
JavaScript的核心语言特性在ECMA-262中是以名为ECMAScript的伪语言的形式来定义的。ECMAScript中包含了所有基本的语法、操作符、数据类型以及完成基本的计算任务所必需的对象,但没有对取得输入和产生输出的机制做出规定。理解ECMAScript及其纷繁复杂的各种细节,是理解其在Web浏览器中的实现--javascript的关键。目前大多数实现所遵循的都是ECMA-262第三版中定义的ECMAScript。以下简要总结下ECMAScript中的基本要素:
①:ECMAScript中的基本数据类型包括undefined,null,boolean,number和string;
②:ECMAScript没有为整数和浮点数值分别定义不同的数据类型,Number类型可用于表示所有数值;
③:ECMAScript中也有一种复杂的数据类型,即Object类型,该类型是这门语言中所有对象的基础类型;
④:ECMAScript提供了很多与C及其他类C语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等。
⑤:ECMAScript从其他语言中借鉴了很多流控制语句,例如if语句、for语句和switch语句等。ECMAScript中的函数与其他语言中的函数有不同之处(没注意到)
⑥无须指定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值。
7:未指定返回值的函数返回的是一个特殊的undefined值。ECMAScript中也没有函数签名的概念,因为其函数参数是以一个包含零或多个之的数组的形式传递的。