注意一点:在ES6之前,JS是没有块作用域的,如果在语句块外部声明的变量,如果在块内部声明一个相同名称的变量,那么程序将取后声明的这个变量的值:
var a = 1;
{
var a = 2;
}
a; // 2
但是ES6开始,用 let
声明的变量是块作用域的:
let a = 1;
{
let a = 2;
}
a; // 1
1.条件判断语句(分支)
a. if...else语句
单分支
if(条件){
语句;
}
如果条件成立,执行语句
双分支
if(条件){
语句1;
}else{
语句2;
}
条件成立(true),执行语句1,条件不成立(false)执行语句2.
多分支
if(条件1){
语句1;
}else if(条件2){
语句2;
}
...
else{
语句;
}
用于根据指定条件返回结果,常见的是 if...else
和 switch
:
False等效值:
在JS中下面的值常常被计算为 false
- false
- undefined
- null
- 0
- NaN
- 空字符串("")
注意:
不要使用原始布尔值 true
和 false
与 Boolean对象的真和假混淆:
let a = new Boolean(false); // Boolean {true}
if (a); // 永真
if (a == true); // 永假
2. switch语句
通过匹配表达式的值到每个 case
标签,若匹配成功则执行相关语句:
switch ( 'leo' ){
case 'pingan':
语句 1
break; // 可选
case 'leo':
语句 2
break;
default: // 都不匹配 则执行默认
语句 n
//break;
}
break
为可选,目的用于保证在正确匹配后,能跳出程序的 switch
语句,并继续执行其他代码,若没有 break
则程序会继续执行下一个 case
语句。
3.异常处理语句
当 throw
语句抛出的异常,我们可以使用 try...catch
捕获并处理,这里需要先介绍两个概念:
throw语句:
用于抛出异常,后面可以是任何表达式:
throw "error !";
throw 404;
throw {msg: 'err'};
try...catch语句:
用于捕获异常, try
后面是程序正常时候执行的程序, catch
后面是当前面有错误抛出的时候执行,并且捕获错误信息作为参数,并且在 catch
块执行完成,参数不可再用。
function f(){
throw 'test error!'
}
try{
f();
console.log('success');
}catch (err){ // err 为前面返回的错误信息
console.log(err);
console.log('failed');
}
// test error!
// failed
通常在 try...catch
后还有一个 finally
语句块,用于不论前面是否有报错,都会执行 finally
语句:
try{
// do something
}catch(err){
// do something
}finally{
// do something
}
try...catch
常常也用在做网络请求的情况下:
function getData (){
try{
let a = fetch(url);
}catch(err){
console.log(err);
}
}
4 . JS中的循环和迭代
首先我们要知道:循环实际上就是把一个事情重复n次执行,也有可能是0次,JS中有以下几种循环语句类型:
- for语句
- do...while语句
- while语句
- labeled语句
- break语句
- continue语句
- for...in语句
- for...of语句
1. for语句
重复执行 for的条件语句,直到循环条件为 false退出循环:
var a =1;
for( a <3){
a ++;
}
这个语句大概执行了以下操作:
1.定义并初始化一个变量 a的值为 1;
2.执行循环语句,条件为当 a<3的时候, a每次递增 1;
3.返回第2步继续循环;
4.当 a在等于4的时候,不满足循环条件 a<3,然后退出循环;
其他例子
/ 求数组中所有值的和
var a =[1,3,4,6];
var sum =0;
for(var i =0;i <a.length;i++){
sum +=a[i];
}
sum; // 14
2. do...while语句
重复执行 do的条件,直到不符合 while的条件,退出循环:
先执行一次循环操作,再判断循环条件是否成立,条件成立,再次执行循环操作.
特点:先执行,再判断
不管条件是否成立,至少执行一次。
do{
a +=1;
console.log(a);
}
while(a <5);
3. while语句
重复执行 while的条件,直到 while的条件为 false,退出循环:
var a =0;
var b =0;
while(a<5){
a++;
b +=a;
}
// a => 5; b => 15
4. labeled语句
用来标识一个程序位置的标识符,如标识一个循环,并在 break或 continue中指出中国标识符,来停止这个循环。
var a =[1,2,3,4,5];
labelName:
for(var i =0;i<a.length;i++){
console.log(i);
if(i >1){
break labelName;
}
}
// 0
// 1
// 2
5. break语句
用于终止一个循环,还可以在 switch中终止,通常这么使用:
一般用在循环内 , 跳出整个循环 循环停止
终止一个循环:
for(var i =0;i<a.length;i++){
if(a[i]==1){
break;
}
}
- 终止一个label
leo:
for(var i =0;i<a.length;i++){
for(var j =0;j<a.length;j++){
if(a[i]==a[j]){
break leo;
}
}
}
6. continue语句
用来跳过当前循环,进入下个循环,可以使用在 while、 do...while、 for或者 label语句:
有使用 continue
var a =0;
var b =0;
while(a<5){
a ++;
if(a ==2){
continue;
}
b +=a;
console.log(b);
}
// 1 4 8 13
没有使用 continue
var a =0;
var b =0;
while(a<5){
a ++;
if(a ==2){
// continue;
}
b +=a;
console.log(b);
}
// 1,3,6,10,15
7. for...in语句
通常用于遍历一个对象的所有可枚举的属性,执行指定方法:
var a =[
{name :'leo'},
{name :'pingan'},
{name :'平安'},
]
for(var k in a){
// a为循环对象 k为当前指针位置
console.log(a[k]);
}
8. for...of语句
通常用于遍历一个可迭代对象(包括 Array, Map, Set和参数对象 arguments等),执行指定方法:
var a =[1,2,5];
for(var k in a){
console.log(k);
// k 为当前元素的下标
}
for(var m of a){
console.log(m);
// m 为当前元素的值
}