一、语法结构
编程语言的语法结构是一套基础性规则,用来描述如何使用这门语言来编写程序。作为语法的基础,它规定了诸如变量名的命名规范,注释的规范,以及程序语句之间如何分隔等规则。下面是介绍JavaScript的基本语法结构。
1、字符集
JavaScript程序是用Unicode字符集编写的,所以它几乎支持世界上的所有语言。
2.1.1区分大小写
JavaScript是区分大小写的,关键字,变量名,函数名和所有标识符都必须采用一致的大小写形式,如关键字while和While、WHILE分别代表不同的意义。
但需要注意的是,HTML并不区分大小写(尽管XHTML区分大小写,但由于浏览器的容错能力还是会正确解析渲染的)。由于他和客户端JavaScript联系紧密,因此这里很容易混淆。许多客户端JavaScript对象和属性与他们所表示的HTML标签和属性同名,在HTML中这些标签和属性名可以使用大写也可以是小写,而在JavaScript中必须是小写。例如在HTML中设置事件处理程序时,onclick属性可以写成onClick,但在JavaScript代码(或者XHTML文档)中,必须使用小写的onclick。
2.1.2 空格、换行符和格式控制符
JavaScript会忽略程序中标识(token)之间的空格,换行符。由于可以在代码中随意使用空格和换行,因此可以采用整齐,一致的缩进来形成统一的编码风格,从而提高代码的可读性。
除了可以识别普通的空格符(u0020),JavaScript还可以识别如下这些表示空格的字符:
水平制表符(u0009)
垂直制表符(u000B)
换页符(u000C)
不中断空白(u00A0)
字节序标记(ufeff)
JavaScript将如下字符识别为行结束符:
换行符(u000A)
回车符(u000D)
行分隔符(u2028)
段分隔符(u2029)
回车符加换行符在一起被解析为一个单行结束符。
2.2注释
JavaScript支持两种格式的注释。
行注释:在“//”之后的文本都会被JavaScript当做注释忽略,
多行注释:“/*”多行注释“*/,注意多行注释是不能嵌套的。
2.3直接量
所谓直接量就是程序中可以直接使用的数值,如下类型:
整数:1,2,3...
小数:1.2,2.34,...
字符串:“Hello World”
bool:true,false。
正则表达式:/正则表达式规则/
null:空
2.4标识符的命名规则
JavaScript中标识符必须以字母、下划线或$开始,后续的字符可以是字母,数字,下划线或美元符($)。需要注意的是和其它语言一样,标识符名是不能以数字开头的。
2.5保留字
我 们在命名变量名时不能与JavaScript的保留字重名。下面是一些常见关键字:
abstract | arguments | boolean | break | byte |
case | catch | char | class* | const |
continue | debugger | default | delete | do |
double | else | enum* | eval | export* |
extends* | false | final | finally | float |
for | function | goto | if | implements |
import* | in | instanceof | int | interface |
let | long | native | new | null |
package | private | protected | public | return |
short | static | super* | switch | synchronized |
this | throw | throws | transient | true |
try | typeof | var | void | volatile |
while | with | yield |
2.6可选的分号
和其它许多编程语言一样,JavaScript使用分号(;)将语句分隔开,这对增强代码的可读性和整洁性是非常重要的,缺少分隔符,一条语句的结束就变成了下一条语句的开始。在JavaScript中如果语句独占一行,通常可以省略分号,但还是建议使用分号来明确标记语句的结束,这是一种编程风格,还有一种就是在任何可以省略分号的地方都将其省略,只有在不得不用的时候才使用分号,介于这种风格需要注意以下问题:
// 1、两条语句独占一行,并且能被正确解析。所以可以省略分号 a = 3 b = 4 // 2、两条语句在一行,必须用分号标明语句的结束位置 a = 3; b = 4; // b的分号可以省略 // 3、下面要注意的就是JavaScript并不是将所有独占一行的语句都自动填补分号 // 前提是独占一行的语句能够得到正确的解析,如下代码: var a a = 3 console.log(a) // 会被解析成如下代码 var a; a = 3; console.log(a); // 4、下面是很容易造成混淆和难以理解的地方 var y = x + f (a+b).toString() // 也许我们会认为JavaScript会解析成这样var y = x + f;(a+b).toString() /* 实际JavaScript会解析成var y = x + f(a+b).toString() 而上述代码的本意并不是这样,所以为了正确解析,需要写分号来明确语句的结束。 通常来讲,如果一条语句以(、[、/、+、-开始,name它既有可能和前一条 语句何在一起解析。以/、+、-开始的语句并不常见,而已(和[开始的语句 则非常常见,有些程序员喜欢保守的在语句前加一个分号,这样哪怕之前的 语句被修改了,分号被误删除了,当前语句还是会正确解析: */ var y = x + f; ;(a+b).toString(); // 5、return和continue需要注意的地方 return true; /* 本意是 return true; 实际是return;true; 在return和continue后面的表达式不能有换行。如果添加了换行,程序则只有在极特殊的情况才会报错,而且程序的调试非常不方便。 */ // 关于++和--需要注意的地方 x ++ y // 会被解析成x;++y;
所以为了避免上述情况的发生,和代码的可读性最好还是在语句的结束位置添加分号。
二 数据类型、值和变量
JavaScript的数据类型分为两类
原始类型(primitive type):数字、字符串、布尔值。
对象类型(object type):object。
JavaScript有两个特殊的原始值:null和undefined(未定义),它们不是数字,字符串和布尔值,它们通常分别代表了各自特属于类型的唯一成员。
关于对象object是属性(property)的集合,每个属性都由“键:值”构成。
普通的JavaScript对象是“键:值”的无序集合,JavaScript同样定义了一种特殊对象数组(array),表示带编号的值的有序集合。JavaScript为数组定义了专用的语法,使数组拥有一些和普通对象不同的特性。
JavaScript还定义了另一种特殊对象函数,函数是具有与它向关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果。
如果函数用来初始化(使用new运算符)一个新建的对象,我们称之为构造函数(constructor)。除了数组array类和函数之外,JavaScript定义了三种有用的类,日期(data)定义了日期对象,正则(RegExp)类定义了正则表达式对象。错误(error)定义了JavaScript程序运行时错误和语法错误的对象。
JavaScript解释器有自己的内存管理机制,可以自动对内存进行垃圾回收。这意味着程序员可以按需创建对象,不必担心这些对象的销毁和内存回收。当不再有任何引用指向一个对象,解释器就会知道这个对象没用了,然后自动回收它所占用的内存资源。
JavaScript程序可以更改对象属性值和元组元素的值,数字、布尔值、null和undefined属于不可变类型。JavaScript可以自由的进行数据类型转换,如果在程序期望使用字符串的地方使用了数字,JavaScript会自动将数字转换成字符串,如果在期望使用布尔值的地方使用了非布尔值,JavaScript会进行相应的转换。
JavaScript变量是无类型的,变量可以被赋予任何类型的值,同样一个变量可以重新赋予不同类型的值。使用var关键字来声明变量。JavaScript采用词法作用域(lexical scoping)。不在函数内声明声明的变量称为全局变量,它在JavaScript程序中的任何地方都是可见的,在函数内部声明的变量被称为局部变量,局部变量会随着函数的结束而销毁。