语句和表达式
JavaScript执行的时候,是一行一行代码执行的,一般情况下,每一行代码,就是一个语句。
语句是为了完成某个事情而产生的,比如赋值语句:
var a = 1 + 2 ;
这句话就是为了创建一个变量,先用 var 命令来声明变量 a,然后把 1 + 2 的运算结果赋值给 a;
此处的 1 + 2 就是一个表达式,是一个为了计算和得到一个返回值的计算式。
在中文里语句和表达式说起来好像差不多,但是两者还是有区别的:
语句主要是为了完成一个操作、一个事情,一般是不需要去得到具体的返回值,只要把操作完成了就行。
表达式则一般就是为了得到一个具体的返回值,所以还是不一样的。
或许借助一下英语会有更好的理解:语句(statement),表达式(expression),expression的主观性更强一点。
分号
语句一般以分号结尾,换句话说,在一行语句的末尾加上分号,就代表这个句子结束了。
var a = 1 + 2 ;
也可以利用分号,来把多个语句写在一行里:
var a = 1 + 2 ; var b = 'hello';
所以上面说,一般一行代码是一个语句,但是这个就属于特殊情况。
如果分号前面什么都没有,JS引擎也会把这个当成一个语句,但是是内容为空的语句:
; ; ;
比如上面的代码,JS引擎就会认为是三句空语句。
表达式的末尾一般不用加分号,加了没什么意义,比如:
1 + 3 ;
'hello';
这样的表达式只是单纯的产生一个值,没有什么实际的意义。
所以这里要注意语句和表达式在分号上的区别:
var a = 1 + 3 ;
var b = 'hello';
这样的叫语句,是需要加分号的,和上面的表达式区分开。
标识符的规则
一开始我会读成标识( shí )符, 后来用输入打字时发现是标识( zhì )符...
英文是 identifier , 反正不管怎么读,顾名思义,就是一种符号,用来给变量、函数之类的东西取名字的,让人们认识起来更方便,用来识别各种值的合法名称。
标识符有一套命名规则,不符合这个规则的,JS引擎遇到是不认识的,会报错,规则和示例如下:
var a = 1; // 字母
var b2 = 1; // 字母 + 数字
var _ = 1; // 下划线
var _tmp = 1; // 下划线 + 字母
var $ = 1; // 美元符号
var $e = 1; // 美元符号 + 字母
var π = 1; // 特殊字符
var 临时变量 = 1; //还可以用中文
下面是错误示范:
var 1a = 1; // 开头不能是数字
var 23 = 1; // 不能直接用数字来当标识符
var *** = 1; // 标识符不能包含星号
var a+b = 1; // 标识符不能包含加号
var -d = 1; // 标识符不能包含减号或连词线
另外注意:
-
JavaScript是区分大小写的,变量 A 和变量 a 不是同一个变量!
-
JavaScript 有一些保留字,是提前设计好用于实现特殊功能的,不能用作标识符:
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。
条件语句
条件语句用于完成条件判断,满足预设条件后,执行特定功能。
if else 语句
//简单的写法
if(布尔值){
语句;
}
//上面写法简化版,当{}里只有一个语句时,可以把括号省略
if (布尔值) 语句;
//常见的完整写法
if(布尔值){
语句;
}else{
语句;
}
上面是比较常见的写法,下面是几种相对特殊一些的写法:
//if...else...里嵌套if...else...
if(a < 100){
console.log('这个数小于100');
}else{
if(a < 1000){
console.log('这个数大于100,小于1000');
}else{
console.log('这个数大于1000');
}
}
//上面代码的另一种写法,else if...
if(a < 100){
console.log('这个数小于100');
}else if(a < 1000){
console.log('这个数大于等于100,小于1000');
}else{
console.log('这个数大于1000');
}
//这组代码实际上是两个if...else...的嵌套,而并不是本来就有else...if...这种东西
//注意:else只和最近的那个if配对,不要被位置所迷惑和混淆
var a = 1;
if(a === 2)
console.log('a是2');
console.log('a不是2');
//输出结果是 a不是2
//这里明显if语句的花括号省略了,因为花括号里只有一个语句时,才能省略,所以第二个console.log()虽然和第一个console.log()缩进是一样的,但是并不在if语句里面。注意,JS的空格是无意义的,注意别被坑。
if(a < 100){
console.log('这个数小于100')
}else
if(a < 1000)
console.log('这个数大于等于100,小于1000')
//这里,else里只有if(a < 1000){ console.log('这个数大于等于100,小于1000') } 一个语句,所以省略花括号,然后相对于里面这个if语句,console.log('这个数大于等于100,小于1000')又是一个语句,所以这个if语句的花括号也能省略。
if(a === 2){
console.log('a是2');console.log('a不是2');
}
if(a === 2){
console.log('a是2'),console.log('a不是2');
}
//这里要注意,两个console.log()中间是逗号还是分号,不同符号得出的结果是不同的!
switch语句
switch可以说是if...else...语句的升级版,当多个if...else...连用时,就可以转换为switch结构。
if(x === 1){
console.log('x等于1');
}
if(x === 2){
console.log('x等于2');
}
if(x !== 1 && x !== 2){
console.log('x等于其他值');
}
//上面的代码就可以转换成switch结构
switch(x){
case 1:
console.log('x等于1');
break;
case 2:
console.log('x等于2');
break;
default:
console.log('x等于其他值');
}
//大部分时候,switch语句是要和break命令搭配使用的,不然执行完相应的语句后,并不会跳出switch结构,还会继续往下执行
var x = 1;
switch(x){
case 1:
console.log('x等于1');
case 2:
console.log('x等于2');
default:
console.log('x等于其他值');
}
//x等于1
//x等于2
//x等于其他值
三元运算符
也叫三元表达式,或者问号冒号表达式,其实是对if...else...的花括号里只有一个语句的时候的一种简单写法:
function max(a,b){
if(a>b){
return a;
}else{
return b;
}
}
//这里max函数里的if...else语句就可以用三元表达式来改写
function max(a,b){
return a>b?a:b;
}
循环语句
while循环
//语法:
while(条件){
语句;
}
//如果花括号里只有一个语句时,也能简写成下面两种形式:
while(条件)
语句;
while(条件)语句;
//实例:
var i = 0;
while(i < 5){
console.log(i);
i = i + 1;
}
//先判断( )里的表达式是否成立,不成立就会执行下面的代码,成立则跳出循环
for循环
for循环可以看作是while循环的一种方便的写法:
var i = 0;
while(i<5){
console.log(i);
i = i + 1;
}
//上面的代码可以改成成for循环
for(var i = 0;i < 5;i++){
console.log(i);
}
do...while循环
break和continue
循环语句常常和break和continue命令搭配使用。
for(var i = 0;i < 10;i++){
if(i%2 === 1){
break;
}else{
console.log(i)
}
}
//0,当i第二次循环的时候,值为1,符合if的判断条件,里面遇到了break命令,就直接停止循环了
for(var i = 0;i < 10;i++){
for(var j = 0;j < 10;j++){
if(i === 5){
break;
}
}
console.log(i);
}
//这里虽然有break命令,这里还是会依次输出 0,1,2,3,4,5,6,7,8,9
//因为break只会跳出最近的那个循环
break命令的作用是跳出循环,而continue命令,则是继续循环,直接进入下一轮循环:
for(var i = 0;i < 10;i++){
if(i%2 === 1){
continue;
}else{
console.log(i)
}
}
//依次输出0,2,4,6,8
标签(label)
JavaScript允许语句前面有标签(label),作用相当于定位符,用于跳转到程序的任意位置,语法如下:
label:
语句;
//标签可以是任意标识符,但不能是保留字,语句也可以是任意的语句
{
a:1
}
//花括号代表一个代码块,代码块里有一个标签a,标签的内容是1
//很多人会以为这是一个对象,但其实不是,这是标签,如果下面这样才是对象,注意区分:
var a = {
foo:1
}
typeof a //"object"
foo:{
console.log(1);
break foo;
console.log('这行不会输出');
}
/*
foo是一个标签,标签里的内容是一个代码块。
代码块输出结果是1,代码块里先 console.log() 打印一个1,然后break命令后面加上标签名foo,注意这里标签名没加引号;意思是直接跳出这个标签,结束执行里面的语句;
*/
标签(label)经常和 break 和 continue 搭配起来使用:
demo:
for(var i = 0;i < 3;i++){
for(var j = 0;j < 3;j++){
if(i === 1 && j === 1)break demo;
console.log('i=' + i + ',' + 'j=' + j);
}
}
//i=0,j=0
//i=0,j=1
//i=0,j=2
//i=1,j=0
//上面是双重循环区块, break后面加了demo标签,满足条件时,直接跳出双层循环(也就是跳出demo标签整个代码块)。如果这里不加demo标签名,则跳出内层循环,进入下一次外层的循环。
demo:
for(var i = 0;i < 3;i++){
for(var j = 0;j < 3;j++){
if(i === 1 && j === 1)continue demo;
console.log('i=' + i + ',' + 'j=' + j);
}
}
//i=0,j=0
//i=0,j=1
//i=0,j=2
//i=1,j=0
//i=2,j=0
//i=2,j=1
//i=2,j=2
//continue后面跟标签名,表示满足条件的时候,会跳过当前的循环,直接进入下一次的外层循环。如果continue后面不加标签名,就是直接进去下一层内循环。