1、***循环结构:宏观几乎是一瞬间执行的,相同 或 相似的 代码
1、*var 循环变量=几;
while(循环条件){
操作;
变量变化;
}
var i = 10;
while (i < 10) {
console.log(i + "hello world");
i++;
}
2、do...while循环语法:
var 循环变量=几;
do{
操作;
变量变化;
}while(循环条件)
var i=10
do{console.log(i+"hello world")
i++}wlie(i<10)
面试题:while和do...while的区别?
只看第一次,如果大家都满足,则没区别
如果不满足,while一次都不执行,而dowhile至少会执行一次
3、*for(var 循环变量=几;循环条件;变量变化){
操作;
}
4、*退出循环语句:
break - 退出整个循环
continue(扣门的蘑菇鹰变成了巫医) - 退出本次循环
5、死循环:while(true){} for(;;){}
forEach for in for of - 专门为遍历数组准备的
2、*****数组的基础:
1、什么是数组:一个集合可以保存多个数据
何时使用:多个相关的数据,都要集中的定义在一个集合中
为什么:因为一个好的数据结构,能够极大的提升我们程序员的开发效率
2、创建:2种
1、*直接量方式:var arr=[值1,...];
2、构造函数方式:var arr=new Array(值1,...);
坑:new Array(num); - 懂不起:以为你是创建了一个长度为num的空 数组
3、访问:数组名[下标];
添加/修改:数组名[下标]=新值;
特殊:访问时,下标越界 - 返回undefined
添加时,下标越界 - 变为稀疏数组,导致下标不连续,导致以后遍历一定会得到 undefined
4、数组三大不限制
1、不限制类型
2、不限制长度
3、不限制下标越界 - 不推荐
5、数组唯一的一个属性:数组名.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、*如何释放一个引用类型:看清楚此引用类型有几个变量关联着,每个变量都要释放后,才能真正 的释放干净
只是保存了地址值
var arr1=[1,2,3,4,5];
var arr2=arr1;
arr2=null;//arr2释放了地址值,arr1依然保存着,所有不会被释放成功
arr1=null;
console.log(arr1);
console.log(arr2);
建议:我们的代码都要封装在一个函数中,函数中的一切变量都会自动释放
索引数组:下标都是由数字组成的数组
8、*关联(hash)数组:下标是可以自定义的数组
为什么:索引数组的下标无具体的意义,不便于查找
如何使用:
1、创建:2步
1、创建一个空数组:var arr=[];
2、为数组添加自定义下标并且赋值:arr["自定义下标"]=新值
2、访问:arr["自定义下标"]
3、强调:hash数组length永久失效,永久为0!
问题:hash数组不能使用for遍历,必须使用 for in循环遍历数组,语法:
for(var i in 数组名){
console.log(i);//自动获得当前数组的所有的下标,不需要我们去设置从哪里开始到哪里结束
console.log(arr[i]);//当前次元素
}
牛逼:不光可以遍历hash数组,也可以遍历索引数组:
建议:hash用for in,索引用for
4、*js中一切东西都是对象,万物皆对象,除了undefined和null,【一切对象的底层都是 hash数组】
备注:构造函数的 nem array(num) 只有一个值的时候,懂不起以为你创建了一个num长 var st = new Array(1);
console.log(st);度的空数组
3、*****数组的API:数组的函数,前辈们定义好的,只有数组可以使用:
1、*****arr 转为 str(字符串):
1、语法:var str=arr.join("自定义连接符");
作用:
1、鄙视时:给你一个数组,将他无缝拼接在一起:
var arr=["h","e","l","l","o"];
var str=arr.join("");
console.log(str);
2、拼接为页面元素:
//以后从数据库中取出数据
var cities=["-请选择-","北京","南京","西京","东京","重庆"];
//拼接成页面元素后,innerHTML是识别标签的
sel.innerHTML="<option>"+cities.join("</option><option>")+" </option>";
2、*拼接数组:添加元素的新方式:
语法:var newArr=arr.concat(值1,arr1,...);
var arr = [1, 2, 3, 4, 5];
var arr1 = [10, 20, 30, 40];
var newArr = arr.concat(6, 7, 8, 9, arr1);
console.log(arr);
console.log(newArr);
特殊:1、此方法不修改原数组,只会返回一个新数组
2、支持传入数组参数,悄悄的将我们传入的数组打散,不会变成二维数组
3、*截取子数组:取出数组中想要的某一部分组成的一个新数组
语法:var subArr=arr.slice(starti,endi);(开始,结束)
特殊:1、此方法不修改原数组,只会返回一个新数组
2、含头不含尾
3、第二参数可以省略不写,截取到末尾
4、第一个参数也可以省略不写,如果两个参数都没写,从头截取到尾 - 深拷贝(复制了一份副本)
5、支持负数参数,-1代表倒数第一个
以上的API都不会修改原数组
以下的API都会修改原数组
4、*删除、插入、替换:
删除:var dels=arr.splice(starti,n);//n代表删除的个数
特殊:此方法其实也有返回值,返回的就是你删除的元素组成的一个新数组
插入:arr.splice(starti,0,新值1,....);
特殊:1、没有删除,也有返回值,返回的是一个空数组
2、原starti位置的元素以及后续元素都会向后顺移
3、不建议插入数组,会变得不伦不类
替换:var dels=arr.splice(starti,n,新值1,....);
特殊:删除的个数和插入的个数不必相同
5、反转数组:arr.reverse();
1
1、二级联动:关键点:
1、必须有二维数组:再次细分分类
2、select的专属事件:onchange -> 只有选中项发生变化
3、select的专属属性:select.selectedIndex -> 获取到当前选中项的下标,但是只有select自带此功能
4、其实事件名其实就是函数名
2、思考题:随便写一个全是数字组成的数组,乱的,排序 ,不准用我没教过的API
4、创建两个数组,一个arr1数组全部放着国家的名称,另一个arr2数组是一个空数组,页面上有4个按钮:
>>:把arr1里面所有的东西全部放到arr2中
<<:把arr2里面所有的东西全部放到arr1中
>:把arr1里面的第一个元素放到arr2的末尾
<:把arr2里面的第一个元素放到arr1的末尾
只需要每次点击在控制台输出,让我看到数组的变化即可
案例 <body>
<select id="sel1"></select>
<select id="sel2"></select>
<script type="text/javascript">
//生成一级的数据
var cities = ["-请选择-", "北京", "南京", "西京", "东京", "重庆"];
// //二维数组:再次细分分类
var arr = [
["-请选择-"],
["朝阳区", "海淀区", "东城区", "西城区"],
["南京1", "南京2", "南京3", "南京4"],
["西京1", "西京2", "西京3", "西京4"],
["东京1", "东京2", "东京3", "东京4"],
["渝中区", "九龙坡区", "江北区", "渝北区"],
];
sel1.innerHTML =
" <option>" + cities.join("</option><option>") + "</option>";
sel1.onchange(只有选中项发生变化 ,select的专属事件) = function () {
var i = this.selectedIndex;(获取到当前选中项的下标,但是只有select自带此功能)
sel2.innerHTML =
"<option>" + arr[i].join("</option><option>") + "</option>";
};
sel1.onchange();
</script>
</body>