*循环结构:
1、*var 变量=几;while(循环条件){循环体;变量的变化}
2、var 变量=几;
do{
循环体;
变量的变化
}while(循环条件)
3、*for(var 变量=几;循环条件;变量的变化){
循环体;
}
4、*退出循环:
break - 退出整个循环
continue - 退出本次循环
5、死循环:
while(1){}
for(;;){}
面试题(while和do...while的区别?)
面试题:while和do...while的区别?
只看第一次,如果条件都满足,则没区别
如果条件不满足,则while一次都不会执行,do...while至少会执行一次
*数组的基础:
1、概念:什么是数组:
概念:
什么是数组
何时:只要存储的多个相关的数据,都要用数组集中保存
为什么:一个好的数据结构,可以极大的提升程序员的开发效率
2、创建:2种
1.*直接量:var arr=[值1,....];
2.构造函数:var arr=new Array(值1,....); - 有一个坑new Array(num);
3、访问:数组名[i] - 当前元素
添加/修改:数组名[i]=新值
特殊:读取元素,下标越界 - 返回undefined
添加元素,下标越界 - 下标不在连续,导致变成一个稀疏数组
4、数组的三大不限制:长度、类型、下标越界(不好)
5、数组的唯一的属性
数组的唯一的属性:长度:arr.length
三个固定套路:
1、末尾添加:arr[arr.length]=新值
2、获取倒数第n个:arr[arr.length-n]
3、缩容:arr.length-=n
6、遍历数组:
for(var i=0;i<arr.length;i++){
arr[i];//当前次元素
}
7、如何释放引用类型
如何释放引用类型:看清楚你的这个引用类型有几个变量引用着,都要释放后才能真正的释放干净
建议:我们的代码尽量的都要封装在一个函数之中!函数中的内存会自动释放
8、*关联(hash)数组
关联(hash)数组 - 下标都是可以自定义的数组
为什么:索引数组的下标,无具体的意义,不便于理解和查找
如何使用:
1、创建:2步
1、先创建一个空数组:var arr=[];
2、为空数组添加自定义下标以及内容:arr["自定义"]=新值;
2、访问:arr["自定义下标"];
3、强调:hash数组的length永远失效了,永远为0!
遍历数组,不能再使用for循环,必须使用for in循环 - 纯自动化循环,【专门为遍历数组准备的】
for(var i in 数组名){
i;//自动得到下标
数组名[i];//得到当前次元素
}
很棒:不光可以遍历hash数组,还可以遍历索引数组。
个人:遍历索引数组使用for循环,遍历hash数组再使用for in
4、hash数组的原理:
hash算法:将字符串,计算出一个尽量不重复的数字(地址值)
字符串的内容相同,则计算出来的数字也是相同的
添加元素:将自定义下标交给了hash算法,得到了一个数字(地址值),直接将你要保存的数据放到了此地址
获取元素:将指定的自定义下标交给hash算法,得到一个和当初添加上完全相同的数字(地址值),通过地址就可以找到你当初保存的数据
5、***js里万物皆对象(除了undefined和null),【一切对象的底层都是hash数组】
*数组的API
1、 ***** 数组 转为 字符串
var str=arr.join("自定义连接符")
固定套路:2个
1、鄙视题:将数组里面的内容拼接为一句话/单词,无缝拼接
arr.join("")
2、将数组里面的数据拼接为DOM页面元素
//数据
var arr=["-请选择-","北京","南京","西京","东京","重庆"]
//将数组转为字符串,只不过是拼接了标签
var str="<h1>"+arr.join("</h1><h1>")+"</h1>"
//渲染到DOM树上
bd.innerHTML=str
2、*拼接数组:添加元素的新方式
//根据你传入的实参全部拼接到数组的末尾
var newArr=arr.concat(新值1,...)
特殊:1、不修改原数组,只会返回一个拼接后的新数组
2、支持传入一个数组参数进行拼接,悄悄的将你的数组打散放入
3、*截取子数组:
//根据你传入的开始下标一直截取到结束下标
var subArr=arr.slice(starti,endi+1)
特殊:
1、不修改原数组,只会返回一个截取后的新数组
2、含头不含尾
3、endi可以省略不写,会从starti一直截取到末尾
4、两个实参都可以省略,从头截到尾,复制了一份(深拷贝-两者互不影响)
5、支持负数参数,-1代表倒数第一个
以上的API都是不会修改原数组的
4、*删插替:
删除:var dels=arr.splice(starti,n)
特殊:其实splice也有返回值,返回的是你删除的元素组成的一个新数组
插入:arr.splice(starti,0,新值1,...)
特殊:1、原starti位置的元素以及后续元素都会被向后顺移
2、千万不要插入一个数组,会变成到土不洋的数组
替换:var dels=arr.splice(starti,n,新值1,...)
特殊:插入的个数和删除的个数不必相等
5、反转数组
反转数组:arr.reverse()
二级联动案例
<body>
<select>
</select>
<select>
</select>
<script>
//二级联动:
//专属事件:select.onchange - 只有选中项发生变化才会触发
//专属属性:select.selectedIndex - 选中项的下标,不需要自定义下标,但是只有select可以
var sels = document.getElementsByTagName("select")
var city = ["-请选择你的城市-", "重庆", "上海", "北京", "成都"]
console.log(city)
//二维数组-细分分类
var street = [
["-请选择你的城市-"],
["-请选择你的城市-", "重庆", "沙坪坝", "南岸区", "巴南区"],
["-请选择你的城市-", "上海", "上海1", "上海2", "上海3"],
["-请选择你的城市-", "北京", "北京1", "北京2", "北京3"],
["-请选择你的城市-", "成都", "成都1", "成都2", "成都"],
]
//将数组里面的数据拼接为一个dom页面元素
sels[0].innerHTML = "<option>" + city.join("</option><option>") + "</option>"
//select专属事件状态改变事件
sels[0].onchange = function () {
//专属属性选中项的下标,不需要自定义下标,但是只有select可以
var i = this.selectedIndex
sels[1].innerHTML = "<option>" + street[i].join("</option><option>") + "</option>"
}
sels[0].onchange()
</script>
</body>
