11. 递归调用
递归: 在一个函数的内部再一次调用自己
- 1*2*3*4*5
- 5*4*3*2*1
求 5!(5*4*3*2*1) 4!(4*3*2*1) 3!(3*2*1)
- 2!(2*1) 1!(1*1)
- 5!=5*4!
- 4!=4*3!
- 3!=3*2!
- 2!=2*1!
- 1!=1
通过一个函数, 求数字 n 的阶乘
10!=10*(10-1)!
效率:
在本次调用还未结束时, 就开始下次的调用, 本次调用就会被挂起,
直到所有的调用都完成之后, 才会依次返回, 调用的次数越多, 效率越低.
12. 分支结构
1.if 结构
if(条件){
语句块;
}
注意:
条件尽量是 boolean 的, 如果不是 boolean, 以下情况会当做 false 处理
- if(0){...}
- if(0.0){...}
- if(""){...}
- if(undefined){...}
- if(null){...}
- if(NaN){...}
注意: if 后的 {} 可以省略, 但是不推荐, 只控制 if 后的第一句话.
2.if...else... 结构
语法:
if(条件){
语句块
}else{
语句块
- }
- 3..if....else if...else...
语法:
if(条件 1){
语句块 1
}else if(条件 2){
语句块 2
}else if(条件 3){
语句块 3
}else{
语句块 n
- }
- 4.switch...case
1. 作用:(使用场合)
等值判断
2. 语法
1.switch(值 / 表达式){
case 值 1:
语句块 1;
break;// 结束 switch 结构, 可选的
case 值 2:
语句块 2;
- break;
- ...
- default:
语句块 n;
break;
}
2. 特殊用法
执行相同操作时:
switch(值 / 表达式){
case 值 1:
case 值 2:
case 值 3:
语句块;
}
12. 循环结构
1. 特点
循环条件: 循环的开始和结束
循环操作: 要执行的相同或相似的语句
2. 循环 - while
语法:
- while(条件){
- // 循环体 - 循环操作
- // 更新循环条件
- }
3. 循环的流程控制
1.break
作用: 终止整个循环的运行
2.continue
作用: 终止本次循环的运行, 继续执行下一次循环
ex:
循环从弹出框中录入信息, 并且打印, 直到输入 exit 为止.
4. 循环 - do...while
1. 语法
- do{
- // 循环体
- }while(条件);
执行流程:
1. 先执行循环体
2. 再判断循环条件
如果条件为真, 则继续执行循环体
如果条件为假, 则跳出循环操作
5. 循环 - for
语法:
- for(表达式 1; 表达式 2; 表达式 3){
- // 循环操作
- }
表达式 1: 循环条件的声明
表达式 2: 循环条件的判断
表达式 3: 更新循环变量
执行流程:
1. 先执行表达式 1
2. 判断表达式 2 的结果(boolean 类型)
3. 如果 2 条件为真, 则执行循环体, 否则退出
4. 执行完循环体后, 再执行表达式 3
5. 判断表达式 2 的结果
- ex: for(var i=1;i<=10;i++){
- console.log(i);
- }
13.for 的特殊用法
1.for(表达式 1; 表达式 2; 表达式 3;){}
1. 省略表达式
三个表达式可以任意省略, 分号不能省
但一定在循环的内部或外部将表达式补充完整
2. 表达式 1 和表达式 3 允许写多个表达式, 用逗号隔开表达式
14. 循环嵌套
1. 循环嵌套
在一个循环的内部, 又出现一个循环
- for(var i=1;i<100;i++){ // 外层循环
- for(var j=1;j<=10;j++){
- // 内层循环
- }
- }
外层循环走一次, 内层循环走一轮
15. 数组
1. 什么是数组
在一个变量中保存多个数据.
数组是按照线型顺序来排列的 - 线型结构
数组中: 除了第一个元素外, 每个元素都有一个直接的 "前驱元素".
数组中: 除了最后一个元素外, 每个元素都有一个会直接的 "后继元素".
2. 声明数组
1. 语法
1.var 数组名 =[];
var names=[];
2.var 数组名 =[元素 1, 元素 2, 元素 3...];
var names=["孙悟空","猪八戒","沙和尚"];
3.var 数组名 = new Array();
var names=new Array();
4.var 数组名 = new Array(元素 1, 元素 2...);
var names=new Array("林黛玉","贾宝玉","王熙凤");
3. 数组的使用
1. 取值和赋值操作
取值:
数组名[下标]
- var newArr=["tom","lilei"];
- newArr[0]
赋值:
数组名[下标]= 值;
newArr[2]="韩梅梅";
2. 获取数组的长度
数组长度: 数组中元素的个数
属性: length
语法: 数组名. length
3. 配合循环, 遍历数组中的每个元素
for(var i=0;i<names.length;i++){
i: 表示数组中每个元素的下标
names[i]: 每个元素
}
length 表示数组中即将要插入的元素的下标
- var names=["tom","lili","lucy"];
- names[names.length]="lilei";
16. 关联数组
1. 关联数组
以字符串作为元素的下标的数组, 就是关联数组.
以数字作为下标的数组, 就是索引数组.
$array=["name"=>"tom"]
2.JS 中的关联数组
var array=[];
array["字符串下标"]= 值;
注意:
1. 关联数组中, 字符串下标的内容是不记录到 length 中的
2. 只能通过 字符串 做下标取值
3.for...in
遍历出任意数组中的字符串下标 以及 索引下标
语法: for(var 变量 in 数组名){
- // 变量: 字符串下标 或 索引下标
- }
17. 冒泡排序
1. 什么是冒泡
排序算法之一, 将一组数据进行排序, 小的数字往前排, 大的数字往后排.
两两比较, 小的靠前.
var arr=[9,23,6,78,45]; 5 个数 比 4 轮
第一轮: 比较了 4 次
第二轮: 比较了 3 次
第三轮: 比较了 2 次
第四轮: 比较了 1 次
1.n 个数字, 则比较 n-1 轮
for(var i=1;i<arr.length;i++)
2. 轮数增加, 比较的次数较少
for(var j=0;j<arr.length-i;j++)
第一轮 5 -1=4 次
第二轮 5 -2=3 次
第三轮 5 -3=2 次
第四轮 5 -4=1 次
两两比较 小的靠前
- if(arr[j]>arr[j+1]){
- arr[j]^=arr[j+1];
- arr[j+1]^=arr[j];
- arr[j]^=arr[j+1];
- }
18. 数组的常用方法
1.toString();
作用: 将数组转换为字符串, 并返回转换后的结果.
语法: var str = 数组对象. toString();
2.join()
作用: 将数组的元素通过指定的字符连接到一起, 并返回连接后字符串
语法: var str = 数组对象. join("字符");
3.concat()
作用: 拼接两个或更多的数组, 并返回拼接后的结果
语法: var res = 数组对象. concat(数组 1, 数组 2,...);
19. 数组的函数
1.slice()
作用: 截取子数组, 从指定的数组中, 截取几个连续的元素组成一个新的数组
语法: var arr = 数组名. slice(start,[end]);
start: 从哪个下标位置处开始截取, 取值为正, 从前向后算;
取值为负, 从后向前算 0 1 2
- var arr=["中国","美国","俄罗斯"];
- -3 -2 -1
end: 指定结束位置处的下标(不包含自己), 该参数可以省略,
如果省略的话, 就是从 strat 开始一直截取到尾.
2.splice()
作用: 允许从指定数组中, 删除一部分元素, 同时再添加一部分元素
语法: arr.splice(start,count,e1,e2...);
start: 指定添加或删除元素的起始下标
count: 指定要删除元素的个数, 取值为 0 表示不删除
e1: 要增加的新元素, 可以多个
返回值: 返回一个由删除元素所组成的数组
3.reverse()
作用: 将一个数组反转
语法: 数组名. reverse();
注意: 该函数会改变当前数组的内容
4.sort()
作用: 排序, 默认情况下按照数组元素们的 Unicode 码进行升序排序.
语法: 数组名. sort();
特殊:
允许自定义排序函数, 从而实现对数字的升序或降序的排序
- ex:
- var arr=[12,6,4,115,78];
- // 排序函数(升序)
- function sortAsc(a,b){
- return a-b;
- }
- arr.sort(sortAsc);
原理:
1. 指定排序行数 sortAsc, 定义两个参数 a 和 b, 表示数组中相邻的两个数字
2. 将排序函数指定给数组 sort()函数, 数组会自动传递数据到 sortAsc()中,
如果 sortAsc()的返回值 > 0, 则交互两个数字的位置, 否则不变.
使用函数完成升序排序:
- arr.sort(
- function(a,b){ // 匿名函数
- return a-b;
- }
- )
20. 进出栈操作
JS 是按照标准的 "栈式操作" 来访问数组
所有的 "栈式操作" 的特点就是 "后进先出"
1.push()
入栈, 在栈顶添加指定的元素, 并返回新数组的长度
- var arr=[10,20,30];
- // 向栈顶增加新的数据 40
- var len=arr.push(40); //4
- 2.pop()
出栈, 删除 (删除栈顶数据) 并返回删除元素
注意: 改变原来数组
3.shift()
删除数组头部 (第一个) 的元素并返回删除元素
语法: 数组名. shift();
4.unshift()
在数组的头部 (第一个) 元素的位置处, 增加元素, 返回的是数组的长度.
语法: 数组名. unshift(增加的数据);
3. 二维数组
1. 什么是二维数组
在一个数组中的元素又是一个数组, 也可以称为: 数组的数组.
2. 二维数组的使用
- var names=[
- ["孙悟空","猪八戒","沙和尚"],
- ["大乔","小乔","曹操"],
- ["林黛玉","贾宝玉","薛宝钗"]
- ];
- // 打印输出 "小乔"
- console.log(names[1][1]);
来源: http://www.jianshu.com/p/401263e52674