目录
一、循环结构
1、while(循环条件){循环体}
2、do{循环体}while(循环条件)
面试题:while和do..while的区别
只看第一次:如果第一次两种都满足,两者就没有区别
如果第一次不满足,while一次都不执行,do...while至少会执行一次。
3、for(循环变量;循环条件;循环的变化){循环体;}
4、流程控制语句
①break; //退出整个循环
②continue; //退出本次循环,根据需求进行分析使用哪一个
tip:不确定循环次数的情况下,使用while死循环。
二、数组的基础
1、基础概念
在一个内存(变量)中保存了多个数据的一个集合结构。
一个好的数据结构可以极大的提升程序员开发效率。
2、创建(js第一周笔记3)
3、访问(js第一周笔记3)
4、数据的三大限制(js第一周笔记3)
5、数组的唯一属性(js第一周笔记3)
6、遍历数组(js第一周笔记3)
7、如何释放一个引用类型
搞清楚引用类型的数据有几个遍历引用着,都要释放后才会真正的释放
建议:代码都封装在一个函数中,函数中的变量会自动释放。
小知识:底层会有一个垃圾回收器。其中还有一个计数器。当计数器为0后,垃圾回收器才会出现回收掉数据。
8、关联(hush)数组
关联数组的下标是可以自定义的。
索引数组:下标都是由数字组成的数组。
使用场景:索引数组的下标无具体的意义,不便于查找。
使用方式:
①创建:2步
Ⅰ 创建空数组
var arr = [];
Ⅱ 为数组添加下标并且添加元素
arr["自定义下标"]=新值;
②访问元素
arr["自定义下标"];
③强调:
hash数组length永远失效,永远为0.
遍历hash数组,不能使用for循环,必须使用for in循环(专门用于遍历数组)
for(var i in arr){
}
for in循环不能定义从那里开始到哪里结束。
建议:索引数组依然用for ,hash数组用for in。
④hash数组的原理
hash算法:将字符串,计算出一个尽量不重复的数字(地址值)
字符串内容相同,则计算出来的数字也一定是相同的
添加元素:将自定义下标交给hash算法,得到一个数字(地址值),直接将你要保存的数据放到这个地址之中
获取元素:将指定的自定义下标交给hash算法,得到一个和当初保存时一样的数字(地址值),通过地址就找到当前保存的数据
⑤js里面的一切东西都是对象,除了undefined和null,一切对象的底层都是hash数组
三、数组的API(重点)
1、arr转string
var str = arr.join("自定义连接符");
固定套路:
①笔试题:将数组里面的内容拼接为一句话/单词。
var str = arr.join(" ");
②将数组拼接为DOM页面元素
var arr=["北京","南京","西京","东京","重庆"] ; //数据
//转为字符串,并且拼接好标签
var str="<开始>"+arr.join("</结束><开始>")+"</结束>";
//渲染到DOM树上
elem.innerHTML=str;
2、数组拼接
添加元素的新方式。把你传入的实参全部拼接到arr的末尾。
var newArr = arr.concat(新值1,...)
特殊:①不修改原数组,只会返回一个新数组。
②concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素后在拼接。
3、截取子数组
根据你传入的开始下标截取到结尾下标。
var subArr = arr.slice(starti,endi+1);
特殊:
①不修改原数组,只会返回一个新数组。
②含头不含尾。
③endi可以省略不写,会从starti位置一直截取到末尾。
④其实两个是实参都可以省略:从头截尾,深拷贝,和以前的按值传递(浅拷贝)不同,一个修改不会影响到另一个。
以上的API都不会修改数组。
以下的API会修改原数组。
4、删除、插入、替换
①删除
var dels = arr.splice(start1,0); //n代表删除的个数
特殊:其实splice也有返回值,返回的是你删除的元素组成的一个新数组。
②插入
arr.splice(start1,0,值1,...);
注意:Ⅰ 原starti位置的元素以及后续元素都会向后移动。
Ⅱ 千万不要插入一个数组,会导致我们的数组一些是一维,一些是二维,遍历时非常的难受
③替换
var dels = arrsplice(starti,n,值1,...)
注意:删除的元素个数不必和插入元素的个数相同。
5、翻转数组
arr.reverse(); //不使用
6、排序(两种方式)
① 面试/笔试时:手写冒泡排序(从第一个元素开始,依次比较相邻的两个元素,只要前一个元素>后一个元素,两者就交换位置)
var arr = [52, 64, 4, 3, 98, 456, 157, 666];
冒泡排序
for (var j = 1; j < arr.length; j++) {
for (var i = 0; i < arr.length - j; i++) {
if (arr[i] > arr[i + 1]) {
var middle = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = middle;
}
}
}
②正式的开发中使用排序的API(只在数组中使用)
arr.sort();
问题1:默认会将元素们转为字符串,按位PK ascii码,如果希望按数字排序?
解决:
//升序
arr.sort(function(a, b) { //回调函数
console.log(a); //拿到后一个元素
console.log(b); //拿到前一个元素
return a - b; //如果return是一个正数,则后>前,
//如果return是一个负数,则后<前,
//如果return是一个0,则后=前,
//而sort方式正好可以根据返回的正/负/0来进行排序
})
问题2:只能升序排序,如何降序?
arr.sort(function(a, b) {
return b - a;
})
注意:排序其实非常重要,切记,只要以后页面中有排序功能,他的底层一定是一个数组,因为只有数组具有排序的方法
7、栈和队列
添加元素和删除元素的新方式。
①栈:其实就是数组,只不过是一端封闭,只能从另一端进出的数组。
使用场景:优先使用最新的数据,现实生活中,情况不多:公交车、电梯...
方法:
Ⅰ开头进
arr.unshift(新值1,...); //添加元素的新方式,向前添加,缺陷:导致其余元素的下标发生改变
Ⅱ 开头出
var first = arr.shift(); //删除元素的新方式,向前删除,缺陷:导致其余元素的下标发生改变
Ⅲ 结尾进
arr.push(新值1,...); //添加元素的新方式,向后添加,完全等效于arr[arr.length]或者arr.concat
Ⅳ 结尾出
var last = arr.pop(); //删除元素的新方式,向后删除
②队列:其实就是数组,只不过是一端进,另一端出
使用场景:根据先来后到的顺序。
开头进:arr.unshift(新值,...);
结尾出:var last=arr.pop();结尾进:arr.push(新值,...);
开头出:var first=arr.shift();
tip:ES3的数组API到此为止了,后面会补充ES5的API。
扩展
1、二级联动
1、select专属事件:onchange,状态改变事件。
2、select具有一个专属属性。
select.selectediIndex() //直接获取当前选中项的下标
3、必须用到二维数组。
4、点开页面时,程序员提前帮用户触发一次。->调用一次函数。
2、周期定时器
每过一段时间就会执行一次。
开启:
timer = selnterval(function(){
操作;
},间隔毫秒数)
停止:
clearlnterval(timer);
鼠标移入:onmouseenter
鼠标移出:onmouseleave