JavaScript基础语法
JavaScript基本语法
什么是脚本语言?
首先说一下HTML,HTML是一种标记语言,它只能定义内容的表现形式,不具有逻辑性,不能与用户进行交互。如果浏览器在解释HTML语言的基础上,还能够解释和运行嵌入在网页文件中的一种具有程序逻辑的语言,那么网页就能够像平时用到的各种Windows程序一样与用户进行交互,那么网页的功能将会被大大扩展。
像这种嵌入在HTML中的程序语言就称为脚本语言(一条条的文字命令),浏览器中要集成有用于脚本程序的模块,这种模块称为脚本引擎。简言之,脚本语言就是用于编写嵌入于文档中的程序,它由浏览器负责解释和执行,可以在网页上产生动态的显示效果和实现与用户交互的特效功能。
脚本程序代码放在HTML文档的<script></script>标签对之间,当浏览器读取到网页的<script>标签之后就知道应该把其中的内容当做某种程序语言进行解释执行,而不是再把它当做网页中的普通文本。
脚本程序在什么时候执行呢?当浏览器打开一个HTML文档时,它会从头到尾主句解释整个文档中的HTML标签和脚本代码块,如果脚本快中有可以直接执行的语句,浏览器则会在读取到该语句的时候立即执行。
目前最常见的两种脚本语言是VBScript和JavaScript。可以使用<script>标签的language属性来指定要使用的脚本语言。但大多数用户都习惯使用JavaScript。这种嵌入在网页中的脚本语言完全是再浏览器上运行的,与WWW服务器没有任何关系,了解了这个道理,对于区分客户端(浏览器)的脚本语言和ASP、JSP等服务器端的脚本语言的差异是很有帮助的。
JavaScript简介
JavaScript语言的前身叫做LiveScript,自从Sun公司推出著名的Java之后,Netscape公司引进了Sun公司有关Java的概念,将自己原有的LiveScript进行重新设计,并改名为JavaScript。
JavaScript代码并不编译为二进制代码文件,而是作为HTML文件的一部分由浏览器解释执行,维护和修改起来非常方便。同时JavaScript也是一种解释型语言---无需编译就可以随时运行,而且是跨平台的。
Java和JavaScript是两个公司开发的两个不同的产品,作用域用途大不一样:Java是Sun公司推出的面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,是为了扩展NetScape Navigator功能,而开发的一种可以嵌入在Web页面中的机遇对象和事件驱动的解释型语言。Java是一种比JavaScript复杂许多的程序语言,是面向对象的,而JavaScript是简单的脚本语言,是基于对象的,虽然两者在语法上有很多相似之处,但是两者没有多大关系,JavaScript并不是Java的子集。JScript的微软自己的脚本语言,基本上和JavaScript是相同的,只是在一些细节上有所出入。JavaScript不是一成不变的,而且在不同浏览器所支持的JavaScript功能不不尽相同。
基本语法
一、脚本代码的位置,可以在三个地方编写JavaScript脚本代码:
1、在网页文件的<script></script>标签对中直接编写脚本代码程序;
使用最多的情况(一般放在head里面)。
<script>标签的位置并不是固定的,可以出现在<head>或者<body>中的任何地方;而且在一个文档中可以有多个<script>标签来嵌入多段JavaScript代码,每段代码可以互相访问,同将所有JS代码放在一对<script>标签中的效果是一样的。
旧版本的浏览器并不能识别<script>标签,会直接向用户显式其中的内容,而不是当做脚本语言去执行。为了解决这个问题,可以吧<script></script>标签对中的内容用HTML起始和结束注释标记<!--和-->包括起来。
支持<script>标签的浏览器会忽略嵌入在<script></script>标签对中的注释符,也就是它会继续执行注释符之间的脚本程序。
2、将脚本代码放置在一个单独的文件中,在网页文件中引用这个脚本程序文件(.js文件);
Js文件写好之后,只需要在HTML网页中引入JavaScript脚本文件的URL地址即可(也可以通过拖拽的方式)。
3、将脚本程序代码作为某个元素的事件属性值或超链接的href属性值
超链接<a>的href属性除了可以使用http和mailto等协议之外,还可以使用Javascript协议。如:
<a href=”javascript:alert(new Date())”;>javascript</a>
单击这个超链接,浏览器将会执行JavaScript:后面的脚本程序代码。
二、JS中的标识符
->标识符是指JavaScript中定义的符号,例如:变量名、函数名、数组名等。标识符可以由任意顺序的大小写字母、数字、下划线和美元符号组成,但不能以数字开头,不能是Javascript中的保留关键字。
另外,JavaScript是严格区分大小写的。Js中的代码格式、注释等和C#中类似。
->在JS中声明一个变量用var,因为JS是一种弱类型的语言,在运行的时候才能够确定类型;字符串用双引号或者单引号都可以,但是推荐在HTML中用双引号,JS中用单引号。
->如果在JS代码中出现错误,浏览器会直接跳过不执行,这一点类似C#中的try-catch语句。
->DHTML:动态HTML(JavaScript+HTML+CSS)
三、JS数据类型与常量
->布尔类型—Boolean
True or false
->数字类型—number
->整形常量
整型常量可以使用十六进制、八进制和十进制表示。
->实型常量
实型常量是由整数部分加小数部分表示,也可以用科学计数法来表示。
->字符串—string
JS中没有单独的字符常量,而只有表示由若干字符所组成的字符串常量,使用单引号或者双引号引起来(推荐在JS中使用单引号;HTML中使用双引号),在JS中,一个连续的字符串不能分开在两行中编写,如果一个字符串太长,为了便于阅读,可以将字符串在两行上书写,中间加上+号,然后再断行。
->未定义—undefined
用于表示变量还没有被赋值或对象的某个属性不存在。Null表示赋给变量的值为“空“,是一个具有特殊意义的值,而undefined则表示还没有对变量赋值,变量的值还处于未知状态;声明一个变量而未未知赋值,就默认为undefined。
->空对象—null
表示一个变量所指向的对象为空值。
->对象类型—object
JS中,除了object是引用类型之外,其他都是基本数据类型(函数是引用类型)。
Tips:
JS中,定义一个变量但没有为之赋值,那么变量的值就为undefined,在这种情况下,可以使用两种方式判断变量值是否为undefined:
var x;
if(!x)
{
x=’new’;
}或
if(typeof(x)==’undefined’)
{
x=’new’;
}
JS中的变量和运算符、以及循环控制语句:if-else,while,switch-case、循环结束语句break,continue等语句都与C#中类似,不再多写。
值得一提的是JS中变量的作用域:在JS中不存在块级作用域,所以在if语句中声明的变量作用域在整个方法中都可以使用,包括for循环等。Var表示局部变量,不写var表示全局变量,如果在方法外定义变量像这样:var x;那么等同于全局变量,因为它在整个JS代码中都是可以被访问的。因此,我们在声明变量的时候尽量加上var。
另外:switch-case语句中判断表达式结果用的是完全等于(===)。
四、函数
使用函数的目的就是为了使代码清晰、易懂、易读、易维护,因此一个函数中的代码平均不要超过100行,最长不要超过200行,否则这个代码就会变得比较难理解。
定义函数的格式:
function 函数名(参数列表)
{
程序代码
return 表达式;
}
参数列表:就是程序在调用某个函数,执行其中的程序代码时,有时需要给函数传递一些参数,这时就有了参数列表(即使没有参数,方法名后面的括号也不能省)。
返回值:如果主程序要求函数返回一个结果,就必须使return语句后面跟上这个要返回的结果。如果没有返回值或者不写return语句,这个函数就返回一个为undefined的值。
->匿名函数
又称作动态函数,后面直接加分号。
var varName=new function( ){ };
在之后的JS程序中,匿名函数用的非常之多。
->JS中的系统函数
可以直接调用这些函数来完成某些功能。
1、encodeURI
方法返回对一个URI字符串编码后的结果。URL是最常用的一种URI,URI的概念比URL表示的概念更大,它不仅限于描述Internet资源的地址,还包括数字对象标识符DOI和国际标准书号ISBN等标识名称。
在一般情况下,可以简单地认为URL等同于URI。
例如:<script type=”text/javacsript”>
var temp=encodeURI(’http://www.baidu.com/百度知道’);
alert(temp);
</script>
结果如下:
2、decodeURI
DecodeURI方法将一个已编码的URI字符串解码成最初始的字符串并返回。
3、parseInt
parseInt方法将字符串转换为整数,当转换过程中遇到非数字则终止转换,只保留转换成功的数字;如果遇到的第一个就是非数字,则返回NaN(Not a Number)。
parseInt有两个参数:(numString,[radix]),第一个参数是要进行转换的字符串;第二个参数是可选的。如果没有指定第二个参数,则前缀为‘0x’的字符串被视为十六进制,前缀为‘0’的字符串被视为十进制,默认为十进制。
类似的数据转换函数还有:parseFloat。
4、isNaN
isNaN方法用于检测parseInt和parseFloat方法的返回值是否为NaN,如果是则返回true,不是则返回false。
5、string
把任意类型转换为字符串时,如果使用string()可以把null值转换为‘null’,但是如果使用ToString()方法就会报错。
6、eval
eval(….)可以直接执行括号中的代码,就是把字符串编译成JS代码来执行。(不常用)
JS中的系统函数有很多,没有必要全部记住,在需要的时候我一般通过查看W3CSchool中的JavaScript参考手册来找到需要的内容。
五、对象
->对象与对象实例
对象是对某一类事物的描述,是抽象上的概念‘而对象实例是一类事物中的具体个例。对象实例是用new关键字创建的,不是由构造方法创建的,因此在构造方法中部要有返回结果的return语句。使用new关键字创建一个对象实例后,JavaScript会接着自动调用所使用的构造函数。如果不用new关键字,那么就是普通的方法调用。
调用对象的成员方法时,需要使用“对象实例.成员方法”的形式。This关键字一般只在用作对象成员方法的函数中出现,它代表某个成员方法执行时,引用该方法的当前对象实例。在对象的构造方法中使用“this.成员名”的形式,可以为该对象的每个对象实例都增加新的成员。
-> JavaScript的内部对象
对象是JavaScript中用来表示复杂数据类型的一种方式。JavaScript中提供了一些非常有用的内部对象作为语言规范的一部分,每个内部对象都有一些方法和属性,从而为我们快速开发强大的脚本程序提供了非常有利的条件。
1、string对象
String对象是动态对象,需要创建对象实例后才能引用它的属性或方法。
属性:
String对象中最常用的属性是length,表示字符串中的字符个数。
方法:
String对象的方法有很多,主要可用于搜索字符串中的字符、转换字符的大小写,以及为某个字符串添加能控制其在web页面中的显示效果的HTML标签。
① anchor方法:为字符串对象中的内容两边加上HTML的定位标签:
如:var temp=’This is an anchor.’;
Temp=temp.anchor(‘Anchor1’);
alert(temp);
得到的结果为:
<A NAME=’ Anchor1’> This is an anchor.</A>
类似的方法还有:big,bold,dontColor等。
② charAt方法:
返回字符串对象中的指定位置处的字符,位置的有效值为0到字符串长度-1的数值。当指定的索引位置超出有效范围时,charAt方法返回一个空字符串。
③ indexOf方法,返回某个字符串在一个字符串对象中第一次出现的字符位置。搜索从左向右执行,如果未找到字符串,则返回-1。
2、Math对象
Math对象中提供了一些基本的数学函数和常数,是一个静态对象,不能用new关键字创建对象实例,直接用“对象名.成员”的格式来访问其属性或方法。
属性有E(常数e,2.718)、PI(π的值)等;方法有abs方法(返回数字的绝对值)、random(返回一个0-1之间的伪随机数,Math.random调用,与C#中略有不同)。
3、Date对象
Date对象用于表示日期和时间,可以通过Date对象的各种方法得到对象实例中的年份、月份、星期等信息。
4、Array对象
定义一个数组:var arr=[1,2,3];
使用Array对象来创建数组:var arr1=new Array();
var arr2=new Array(4);
var arr3=new Arrar(4,5,6);
使用for-in语句遍历,循环的是数组中的键,也就是数组的下标。值通过arr[key]来得到。
下面的一段代码是在做基础练习时遇到的一点问题:
<script type=”text/javacsript”>
Function Person(){
}
var p1 = new Person();
p1.name = ‘张三’;
p1.age = 20;
Person.prototype.sayHi = function(){
alert(‘Hi,everyone!’);
}
alert("’大家好,我叫’ + this.name + ‘,今年’ + this.age + ‘了。’+p1.sayHi());
</script>
问题:最后一句alert代码中,输出时结果为首先弹出一个“Hi,everyone!”的对话窗,第二次才弹出“大家好,我叫张三,今年20了。undefined”。因为p1.sayHi()方法是被首先执行,然后才执行alert,并且p1.sayHi()的没有返回值,所以得到的结果为undefined。
OK!