循环
var 循环变量=几;
do{
循环体;
循环变量的变化;
}while(循环条件)
和while的区别只看第一次: 如果第一次都满足,则没区别 如果第一次不满足,while一次都不做,do...while至少会执行一次
退出循环的语句:continue - 退出本次循环;break - 退出循环
数组基础
索引数组
下标都数字组成 - 默认
关联数组
下标可以自定义的,目的:不必数下标,查找更快速,下标具有意义
创建:
var arr=[];
arr["自定义下标"]=新值;
访问:
arr["自定义下标"]
遍历
length失效了,只能使用for in循环 - 纯自动化:专门为遍历数组准备的
for(var i in 数组名){
数组名[i];
}
数组API
提前定义好的一些函数,可以直接使用,这些函数只有数组可用
数组转为字符串
var str=arr.join("自定义连接符");
特殊:
- 如果没有传入实参,则和toString效果一致,默认都是用,隔开 固定套路:
- *面试鄙视中:完成无缝拼接
var arr=["h","e","l","l","o"," ","w","o","r","l","d"]; console.log(arr.join("")); - 将数组元素拼接为页面元素(数据渲染)
var arr=["-请选择-","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆","北京","南京","西京","东京","重庆"];
//将数组转为了字符串,并且拼接上了标签
var str="<option>"+arr.join("</option><option>")+"</option>";
//让字符串上DOM树,innerHTML是识别标签
sel.innerHTML=str;
实现:二级联动:4个关键点
- 必须使用二维数组,细分每一个城市,并且二维数组的顺序要和之前的一维数组对应
- select.onchange=function(){} - 状态改变事件:只有选中项发生变化时,才会触发
- select可以直接获取当前选中项的下标,而不需要自定义下标:select.selectedIndex;
- 其实绑定事件,等号左边部分就是你的函数名
拼接数组:添加元素到末尾的新方式
var newArr=arr.concat(值1,arr2....);
特殊:
-
此方法不会修改原数组,必须拿一个变量去接住结果(返回的一个新数组)
-
哪怕拼接的是一个数组,悄悄的打散数组,单个添加
-
截取子数组:可能只想拿到数组中的某一部分
var subArr=arr.slice(starti,endi+1);特殊:
- 此方法不会修改原数组,必须拿一个变量去接住结果(返回的一个新数组)
- 含头不含尾
- 如果只传入了一个实参,则为从starti开始,到末尾
- 如果两个实参都省略,则复制了一份 - 深拷贝!两者互不影响
- 支持负数参数,-1代表倒数第一个,-n代表倒数第n个
以下的API都是修改原数组的
-
删插替:
splice:
- 删除:
var dels=arr.splice(starti,n);//从starti位置开始删除n个元素特殊:返回的是你删除的元素组成的数组 - 有可能你删除的正好是你需要的 - 插入:var dels=arr.splice(starti,0,新值1,....);
特殊:
- 原来starti位置的元素以及后续元素都会被向后移动
- 没有删除元素,也有返回值,返回的是一个空数组而已
- 替换:
var dels=arr.splice(starti,n,新值1,....);var dels=arr.splice(starti,0,新值1,....);特殊:删除的个数 和 插入的个数不必相同
- 删除:
-
翻转数组:arr.reverse(); -- 仅仅只能翻转
array的API
1. 排序:
手写冒泡排序:从第一个元素开始,依次比较两个相邻的元素,如果前一个>后一个,两者就要交换位置
for(var j=1;j<arr.length;j++){
for(var i=0;i<arr.length-j;i++){
if(arr[i]>arr[i+1]){
var m=arr[i];
arr[i]=arr[i+1];
arr[i+1]=m; }
}
}
数组提供了一个排序API - 正式开发:
语法:arr.sort();
特殊:
- 默认转为字符串,按位PK每个字符的unicode(ascii)
- 希望按照数字排序 - 升序
arr.sort(function(a,b){ return a-b; })
a是后一个数,b是前一个数 如果a>b,就会返回一个正数,说明后一个数>前一个数 如果a<b,就会返回一个负数,说明后一个数<前一个数 如果a==b,就会返回一个0,说明后一个数==前一个数 而sort的底层就能通过你返回的值来判断要不要帮你交换位置 3. 希望按照数字排序 - 降序
arr.sort(function(){
return b-a;
})
切记:以后网页中见到任何带有排序功能的特效,说明它的底层一定是数组,因为JS中只有数组可以排序,先排序再数据渲染
2. 栈和队列:作用:添加元素和删除元素的新方式
栈:
一端封闭,只能从另一端进出 - 现实生活中较少,何时使用:希望使用到最新的数据的时候
队列:
只能一端进入,另一端出 - 现实生活中较多,何时使用:按照先来后到的顺序 栈:
开头入:
arr.unshift(新值,....)
开头出:
var first=arr.shift();//一次只能删除一个,而且一定是删除的第一个元素,有可能删除的东西就是你需要的东西
个人不喜欢:开头进出,会导致每个元素的下标都会发生变化
结尾入:arr.push(新值,...);
结尾出:var last=arr.pop();//一次只能删除一个,而且一定是删除的最后一个元素,有可能删除的东西就是你需要的东西
至少不会影响到其他人的位置
队列:以上4个API是可以混搭的
开头入:arr.unshift(新值,....)
结尾出:var last=arr.pop();
结尾入:arr.push(新值,...);
开头出:var first=arr.shift();
二维数组
数组的元素,又一次引用了一个数组 何时使用:你希望再一个数组内再次细分分类 如何使用: var peoples=[ ["吴飞华",18,"洪兴"], ["冯伟朕",19,"东英"], ["封永跃",20,"三联"] ];
访问:arr[r][c] - r代表行下标,c代表列下标 特殊:
- 列下标越界,返回undefined
- 行下标越界,返回报错,因为行下标越界已经得到undefined再加[]则报错 如何遍历: 固定公式:外层循环遍历行,内层循环遍历列
for(var r=0;r<peoples.length;r++){
for(var c=0;c<peoples[r].length;c++){
console.log(peoples[r][c])
}
}
总结:ES3提供的数组:
- 数组的基础(创建、访问、添加、遍历、hash数组)
- 数组的API(10个:join、concat、slice、splice、reverse、sort、push、pop、shift、unshift)
- 二维数组
string的基础概念
什么是字符串:多个字符组成的【只读】字符【数组】!
- 【只读】:字符串所有的API都不会修改原字符串,只会返回新的字符串。
- 【数组】:跟数组有相同点:
- 字符串可以使用下标获取某个字符
- 字符串可以使用length获取字符的长度
- 字符串可以遍历得到每个字符
- 字符串可以使用数组不修改原数组的API(concat、slice)
差异:所有数组直接修改原数组的API,字符串都不可以使用!字符串自己也有一堆API等待我们下周一学习
JS内置对象(引用类型):11个
- String Number Boolean -> 包装类型
- Array Function Date(日期) Math(数学) RegExp(正则:验证)
- Error(错误)
- Object(面向对象)
- Global(全局对象):
- 保存着全局变量和全局函数,只不过浏览器端/客户端/前端global被window代替了,以后我们学习Node.js后端语言的时候你会发全局真的是global
- 唯独window对象可以省略不写
包装类型:专门封装原始类型的值,将原始类型悄悄的变成了引用类型的对象(属性和方法)
为什么:字符串经常会被我们拿来做一些操作,为了方便程序员,提供了包装类型,把字符串变成了一个对象,提供了我们一些操作字符串的属性和方法
本身原始类型的值,不带有任何属性和方法,意味着不能使用.去做操作的 何时使用:只要你试图使用.去操作原始类型的值的时候,包装类型就会悄悄出现 何时释放:方法一旦调用结束,包装类型就会自动释放
为什么undefined和null不能使用.,他们俩没有提供过包装类型(没有任何属性和方法)