开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
本章介绍JavaScript的精华部分的语法,并简要概述其语言结构
空白
空白可能表现为被格式化的字符或注释的形式。空白通常没有意义,但有时候必须要用它来分隔字符序列,否则他们就会呗合并成一个符号。例如,对如下代码来说:
var that = this
var 和 that 之间的空格是不能移除的,但是其他的空格都可以移除。
JavaScript 提供两种注释形式,一种 /* */包围的块注释,另一种是以 //为开头的行注释;在JavaScript中,那些字符对也可能出现在正则表达式字面量里,所以代码块注释对于被注释的代码块来说是不安全的。例如:
/*
val rm_a = /a*/.match(s);
*/
上面的注释导致了一个语法错误。所以,建议避免使用 /* */注释,而用//注释代替它。
标识符
标识符由一个字母开头,其后可选择性地加上一个或多个字母、数字或下划线。
JavaScript不允许在对象字面量中,或者用点运算提取对象属性时,使用保留字作为对象的属性名。
标识符被用于语句、变量、参数、属性名、运算符和标记。
数字
JavaScript 只有一个数字类型,没有分离出整数类型,所以1和1.0的值相同。避免了一大堆因数字类型导致的错误。
NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。你可以用函数isNaN(Number)检测NaN
字符串
字符串字面量可以被抱在一对单引号或双引号中,它可能包含0个或多个字符。
JavaScript没有字符类型。要表示一个字符,只需要创建仅包含一个字符的字符串即可。
\ 是转义字符。转义字符用来把那些正常情况下不被允许的字符插入到字符串中,比如反斜线、引导和控制字符。\u 约定用来制定数字字符编码。
“A” === “\u0041”
字符串有一个length属性。例如,”seven”.length 是 5。
字符串是不可变的。一旦字符串被创建,就永远无法改变它。
两个完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串。所以:’c’ + ‘a’ + ‘t’ === ‘cat’ 是 true。
字符串还有其他方法。如:’cat’.toUpperCase() === ‘CAT’。
语句
一个编译单元包含一组可执行的语句。在Web浏览器中,每个<script>标签提供一个被编译且立即执行的编译单元。
当 var 语句被用在函数内部时,它定义的是这个函数的私有变量。
switch、while、for 和 do 语句允许有一个可选的前置标签,它配合 break 语句来使用。
语句通常按照从上到下的顺序被执行。JavaScript 可以通过条件语句(if 和 switch )、循环语句( while、for 和 do )、强制跳转语句( break 、return 和 throw )和函数调用来改变执行序列。
代码块是包在一对花括号中的一组语句。
if 语句根据表达式的值改变程序流程。表达式的值为真时执行跟在其后的代码块,否则,执行可选的else分支。
下面列出的值被当作假(false):
- false
- null
- undefined
- 空字符串 ‘ ‘
- 数字 0
- 数字 NaN
其他所有的值都被当作真,包括true、字符串“false”,以及所有对象。
swtich 语句执行一个多路分支。它把其表达式的值和所有指定的case条件进行匹配。一个case从句包含一个或多个 case 表达式。 case 表达式不一定必须是常量。要防止继续执行下一个case,case从句后应该跟随一个强制跳转语句。你可以用 break 语句退出 swtich 语句
while 语句执行一个简单的循环。如果表达式值为假,就终止循环。而表达式值为真时,代码块被执行。
for语句是一个结构更复杂的循环语句。它有两种形式。常见的形式是for(let i=0; i<arr.length; i++),由3个可选从句控制:初始化从句、条件从句和新增从句;另一个形式是for(let i in arr)会枚举一个对象的所有属性名(或键名)。通常你需要检测object.hasOwnProperty(variable)来确定这个属性名是该对象的成员,还是来自于原型链。
do 语句就像 while 语句,唯一的区别是它在代码块执行之后而不是之前检测表达式的值,这就意味着代码块至少要执行一次。
try 语句执行一个代码块,并捕获该代码块抛出的任何异常。 catch 从句定义了一个新的变量 variable 来接受抛出的异常对象。
throw 语句抛出一个异常。如果 throw 语句在一个 try 代码块中,那么控制流会跳转到 catch 从句中。如果 throw 语句在函数中,则该函数调用被放弃,控制流跳转到调用该函数的 try 语句的 catch 从句中。
return 语句会导致从函数中提前返回。它也可以指定要被返回的值。如果没有指定返回表达式,那么返回值是 undefined。
break 语句会使程序提出一个循环语句或 switch 语句。它可以指定一个可选的标签,那退出的就是带该标签的语句。
JavaScript 不允许在 break 关键字和标签之间换行。
一个 expression 语句可以给一个或多个变量或成员赋值,或者调用一个方法,或者从对象中删除一个属性。
运算符 = 被用于赋值,不要把它和恒等运算符 === 混淆起来。
运算符 += 可以用于加法运算或连接字符串。
表达式
三元运算符 ?有3个运算数。如果第 1 个运算数值为真,产生第 2 个运算数的值。但如果第 1 个运算数值为假,则产生第 3 个运算数的值。
表:运算符优先级
| 符号 | 解释 |
|---|---|
| . [ ] ( ) | 提取属性与调用函数 |
| delete new typeof + - ! | 一元运算符 |
| * / % | 乘法、除法、求余 |
| + - | 加法/连接、减法 |
| ≥ ≤ > < | 不等式运算符 |
| === ≠ | 等式运算符 |
| & & | 逻辑与 |
| || | 逻辑或 |
| ? : | 三元 |
typeof 运算符产生的值有 number、string,boolean,undefined、function和 object。如果运算数是一个数组或 null,那么结果是 object,这其实是不对的。
如果 !的运算数的值为真,那么产生false,否则产生true。
+运算符可以进行加法运算或字符串连接。如果你想要的是加法运算,请确保两个运算数都是数字。
/ 运算符可能会产生一个非整数结果,即使两个运算数都是整数。
&& 运算符的真假口诀:一假则假。如果第一个运算数的值为假,则产生第 1 个运算数的值,否则产生第 2 个运算数的值。
|| 运算符的真假口诀:一真则真。如果第一个运算数的值为真,则产生第 1 个运算数的值,否则产生第 2 个运算数的值。
字面量
对象字面量是一种可以方便地按指定规格创建新对象的表示法。属性名可以是标识符或字符串。
数字字面量是一种可以方便地按指定规格创建新数组的表示法。
函数
函数字面量定义了函数值。它可以有一个可选的名字,用于递归地调用自己。它可以指定一个参数列表,这些参数就像变量一样,在调用时由传递的实际参数初始化。
函数的主体包括变量定义和语句。