基本词法
JavaScript 语法就是指构成合法的 JavaScript 程序的所有规则和特征的集合,包括词法和句法。简单描述如下: 词法定义了 JavaScript的基本名词规范,包括字符编码、命名规则、标识符、关键字、注释规则、 运算符和分隔符等。 句法定义了 JavaScript的基本运算逻辑和程序结构,包括短语、句子和代码段的基本规则,如表达式、语句和程序结构等。
区分大小写
JavaScript 严格区分大小写。为了避免输入混乱和语法错误,建议采用小写字符编写代码。在以下特殊情况下可以使用大写形式:
构造函数的首字母建议大写。构造函数不同于普通函数。
示例
下面示例调用预定义的构造函数 Date()
,创建一个时间对象,然后把时间对象转换为字符串显示出来。
d = new Date(); //获取当前日期和时间
document.write(d.toString()); // 显示日期
2) 如果标识符由多个单词组成,可以考虑使用骆驼命名法——除首个单词外,后面单词的首字母大写。例如:
代码语言:javascript复制typeOf();
printEmployeePaychecks();
提示:
上述都是约定俗成的一般习惯,不构成强制性要求,用户可以根据个人习惯进行命名。
直接量
直接量(Literal)
就是具体的值,即能够直接参与运算或显示的值,如字符串、数值、布尔值、正则表达式、对象直接量、数组直接量、函数直接量等。
示例
下面示例分别定义不同类型的直接量:字符串、数值、布尔值、正则表达式、特殊值、对象、数组和函数。
//空字符串直接量
1 //数值直接量
true //布尔值直接量
/a/g //正则表达式直接量
null //特殊值直接量
{} //空对象直接量
[] //空数组直接量
function(){} //空函数直接量,也就是函数表达式
转义序列
转义序列就是字符的一种表示方式(映射)。由于各种原因,很多字符无法直接在代码中输入或输出,只能通过转义序列间接表示。
代码语言:javascript复制Unicode 转义序列方法:u 4位十六进制数字。
Latin-1 转义序列方法:x 2位十六进制数字。
示例
对于字符“©” , Unicode 转义为 u00A9
,ASCII 转义为 xA9
。
document.write("xa9"); //显示字符©
document.write("u00a9"); //显示字符©
JavaScript标识符、关键字和保留字
标识符
标识符(Identifier)就是名称的专业术语。JavaScript 标识符包括变量名、函数名、参数名和属性名。
合法的标识符应该注意以下强制规则:
第一个字符必须是字母、下划线(_)
或美元符号($)
。
除了第一个字符外,其他位置可以使用 Unicode 字符。一般建议仅使用 ASCII 编码的字母,不建议使用双字节的字符。
不能与 JavaScript 关键字、保留字重名。
可以使用 Unicode 转义序列。例如,字符 a 可以使用“u0061”
表示。
示例
在下面示例中,定义变量 a,使用 Unicode 转义序列表示变量名。
var u0061 = "字符 a 的 Unicode 转义序列是 \0061";
document.write(u0061);
使用转义序列不是很方便,一般常用转义序列表示特殊字符或名称,如 JavaScript 关键字、程序脚本等。
关键字
关键字就是 ECMA-262 规定的 JavaScript 语言内部使用的一组名称(或称为命令)。这些名称具有特定的用途,用户不能自定义同名的标识符。具体说明如表所示。
break | delete | if | this | while |
---|---|---|---|---|
case | do | in | throw | with |
catch | else | instanceof | try | |
continue | finally | new | typeof | |
debugger(ECMAScript 5 新增) | for | return | var | |
default | function | switch | void |
保留字
保留字就是 ECMA-262 规定的 JavaScript 语言内部预备使用的一组名称(或称为命令)。这些名称目前还没有具体的用途,是为 JavaScript 升级版本预留备用的,建议用户不要使用。具体说明如表所示。
abstract | double | goto | native | static |
---|---|---|---|---|
boolean | enum | implements | package | super |
byte | export | import | private | synchronized |
char | extends | int | protected | throws |
class | final | interface | public | transient |
const | float | long | short | volatile |
ECMAScript 3 将 Java 所有关键字都列为保留字,而 ECMAScript 5 规定较为灵活。
例如,在非严格模式下,仅规定 class、const、enums、export、extends、import、super 为保留字,其他 ECMAScript 3 保留字可以自由使用;在严格模式下,ECMAScript 5 变得更加谨慎,严格限制 implements、interface、let、package、private、protected、public、static、yield、eval(非保留字)、arguments(非保留字)
的使用。
JavaScript 预定义了很多全局变量和函数,用户也应该避免使用它们。具体说明如表所示。
arguments | encodeURL | Infinity | Number | RegExp |
---|---|---|---|---|
Array | encodeURLComponent | isFinite | Object | String |
Boolean | Error | isNaN | parseFloat | SyntaxError |
Date | eval | JSON | parseInt | TypeError |
decodeURL | EvalError | Math | RangeError | undefined |
decodeURLComponent | Function | NaN | ReferenceError | URLError |
不同的 JavaScript 运行环境都会预定义一些全局变量和函数,上表列出的仅针对 Web 浏览器运行环境。 无论是在严格模式下还是在非严格模式下,都不要在定义变量名、函数名或者属性名时使用上面列举出的保留字,以免同学们入坑。
JavaScript空白符(分隔符)
分隔符(空白符)就是各种不可见字符的集合,如空格(u0020)
、水平制表符(u0009)
、垂直制表符(u000B
)、换页符(u000C)
、不中断空白(u00A0)
、字节序标记(uFEFF)
、换行符(u000A)
、 回车符(u000D)
、行分隔符(u2028)
、段分隔符(u2029)
等。
在 JavaScript 中,分隔符不被解析,主要用来分隔各种记号,如标识符、关键字、直接量等信息。 在 JavaScript 脚本中,常用分隔符来格式化代码,以方便阅读。 示例1 对于下面一行代码:
代码语言:javascript复制function toStr(a){return a.toString();}
可以使用分隔符格式化显示:
代码语言:javascript复制function toStr(a){
return a.toString();
}
一般 JavaScript 编辑器都会提供代码格式化的功能。
分隔符使用时需要注意以下几点:
- 分隔符虽然无实际意义,但是在脚本中却不能缺少。如果在标识符与关键字之间不使用分隔符分隔,JavaScript 就会抛出异常。
示例2
在下面代码中,把关键字 function
与标识符 toStr
连在一起,以及把关键字 return
与 toString
标识符连在一起都是错误的。
functiontoStr(a){returna.toString();} //错误写法
function toStr(a){return a.toString();} //正确写法
- JavaScript 解析器一般采用最长行匹配原则,不恰当地换行显示一句代码,容易引发异常或错误。
示例3 下面代码会返回意外的结果。
代码语言:javascript复制function toStr(a){
return
a.toString(); //错误的换行
}
document.write(toStr("abc")); //实际返回 undefined,应该返回"abc"
这是因为 return
作为一条独立语句,JavaScript 解析器可以正确解析它,虽然它后面没有分号,解析器在正确解析的前提下会自动为其补加一个分号,以表示该句已经结束。这样换行显示的 a.toString();
就是下一句待执行的命令,而不是被返回的值。
不能在标识符、关键字等内部使用分隔符。
示例4
在下面函数中使用空格把 toString()
分为两部分,JavaScript 会因无法识别而抛出异常。
function toStr(a){
return a.to String(); //错误分隔符
}
4) 在字符串或者正则表达式内,分隔符是有意义的,不能够随意省略或替换。 **示例5** 在下面代码中,变量 `a `和` b` 被赋予相同的字符串,但是变量` b` 中插入了空格,则比较结果是不相等的。
代码语言:javascript复制var a = "空格";
var b = "空格 ";
document.write((a==b)); //返回 false,说明不相同