基本语法

语句 statement

JavaScript 程序的执行单位为行 line,也就是一行一行地执行,一般情况下,每一行就是一个语句

语句 statement 是为了完成某种任务而进行的操作

// 这就是一条语句
var a = 1 + 3;

1 + 3 叫做表达式 expression,指一个为了得到返回值的计算式

语句 和 表达式的区别在于 前者主要为了进行某种操作,一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。

语句以分号结尾,一个分号就表示一个语句结束,多个语句可以写在一行

var a = 1 + 3; var b = 'abc';

分号前可以没有任何内容,JavaScript 引擎将其视为空语句

// 这就是3个空语句
;;;

表达式不需要分号结尾,一旦在表达式后面添加分号,则 JavaScript 引擎就将其表达式视为语句,这样就会产生一些没有任何意义的语句

变量

变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名

var a = 1;

上面的代码,先声明变量 a,然后在变量 a 与数值 1 之间建立引用关系,称为将数值1 “赋值” 给变量 a

在 JavaScript 的变量名区分大小写,Aa 是两个不同的变量

声明和赋值是两个分开的步骤

var a;
a = 1;

如果只是声明变量而没有赋值,则变量的值是 undefined,这是一个特殊的值,表示“无定义”

var a;
a // undefined

如果变量赋值的时候,忘了写 var 命令,这条语句也是有效的

var a = 1;
// 基本等同
a = 1;

但是不写 var 的做法,不利于表达意图,而且容易不知不觉地创建全局变量,所以建议总是使用 var 命令声明变量

如果一个变量没有声明就直接使用,JavaScript 会报错,告诉你变量未定义

x
// ReferenceError: x is not defined

可以在同一条 var ,命令中声明多个变量

var a, b;

JavaScript 是一种动态类型语言,也就是说,变量的类型没有限制,变量可以随时更改类型

var a = 1;
a = 'hello'

如果使用 var 重新声明一个已经存在的变量是无效的

但是如果第二次声明的时候还进行了赋值,就会覆盖之前的值

var x = 1;
var x;
x // 1

var x = 1;
var x = 2;

//等同于

var x = 1;
var x;
x = 2;

变量提升 hoisting

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升

console.log(a);
var a = 1;

// 等同于

var a;
console.log(a); //undefined
a = 1;

标识符 identifier

标识符指的是用来识别各种值的合法名称。最常见的标识符就是变量名,以及后面要提到的函数名

标识符有一套命名规则,不符合规则的就是非法标识符。JavaScript 引擎遇到非法标识符,就会报错

  • 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号 $ 和下划线 _

  • 第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以使用数字 0 - 9

中文也是合法标识符,可以用作变量名

JavaScript 有一些保留字,不能用作标识符: arguments break case catch class const continue debugger default delete do else enum eval export extends false finally for function if implements import in instanceof interface let new null package private protected public return static super switch this throw true try typeof var void while with yield

注释

单行注释:用 // 起头 多行注释:放在 /**/ 之间

由于历史原因,JavaScript 可以兼容 HTML 代码的注释 <!-- -->

// 下面的代码中,只用 x = 1 会执行
x = 1; <!-- x = 2;
--> x = 3;

而且,--> 只有在行首,才会被当成单行注释,否则会被当初 n-- > 来执行

区块

JavaScript 使用大括号,将多个相关的语句组合在一起,称为区块

对于 var 命令来说,JavaScript 的区块并不构成单独的作用域 scope

条件语句

JavaScript 提供 if 结构和 switch 结构

if 结构

if (布尔值) {
  语句;
}

// 或者
if (布尔值) 语句;

if 表达式中,不要混淆 赋值表达式 =、严格相等运算符 === 和相等运算符 ==

if else 语句中 else 总是与离自己最近的那个 if 语句配对

var m = 1;
var n = 2;

if (m !== 1)
if (n === 2) console.log('hello');
else console.log('world');

// 等同于

if (m !== 1) {
  if (n === 2) {
    console.log('hello');
  } else {
    console.log('world');
  }
}

switch 结构

if...else 连在一起使用的时候,可以转为更为方便的 switch 结构

根据变量 fruit 的值,选择执行相应的 case。如果所有的 case 都不执行,则执行 default 部分。注意,每个 case 代码块内部的 break 语句都不少

switch (x) {
  case 1:
    console.log('x 等于1');
    break;
  case 2:
    console.log('x 等于2');
    break;
  default:
    console.log('x 等于其他值');
}

switch 语句后面的表达式,与 case 语句后买你的表达式进行比较运行结果时,采用的是严格相等运算符 === 而不是相等运算符 == 这意味着不会发生类型转换

三元运算符 ? :

(条件) ? 表达式1 : 表达式2

循环语句

while 循环

while 语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块

while (条件)
  语句;

// 或者
while (条件) 语句;

for 循环

for (初始化表达式; 条件; 递增表达式) {
  语句
}

for 语句后面的括号里,有三个表达式:

  • 初始化表达式 initialize:确定循环变量的初始值,只在循环开始时执行一次

  • 条件表达式 test:每轮循环开始时,都要执行这个条件表达式,只有值为真,才继续进行循环

  • 递增表达式 increment:每轮循环的最后一个操作,通常用来递增循环变量

上面三个表达式可以省略任何一个,也可以全部省略

// 全部省略 就会导致一个无限循环
for ( ; ; ) {
  console.log('hello world');
}

do ... while 循环

不管条件是否为真,do ... while 循环至少运行一次。另外 while 语句后面的分号注意不要省略

break 语句和 continue 语句

这两个语句都具有跳转作用,可以让代码不安既有规律执行

break 语句用来跳出代码块或循环

continue 语句由于立即终止本轮循环,返回循环结构的头部,开始下一轮循环

如果存在多重嵌套,不带参数的 break 语句和 continue 语句都只针对最内层循环

标签 label

JavaScript 运行,语句的前面有标签 label,相当于定位符,用户跳转到程序的任意位置,标签格式如下:

标签可以是任意的标识符,但不能说保留字,语句部分可以说任意语句

label:
    语句;

标签 label 通常和 break 语句和 continue 语句配合使用,跳出特定循环

top:
    for (var i = 0; i < 3; i++) {
      for (var j = 0; j < 3; j++) {
        if (i === 1 && j === 1) break top;
        console.log('i=' + i + ', j=' + j);
      } 
    }

上面是一个双重嵌套,break 如果后面不加 top 那么只能跳出内层循环,进行下一次外层循环,只有加上 top 才能跳出两层循环

标签也可以用于跳出代码块

最后更新于