循环结构
宏观上看:几乎是在一瞬间执行的,【相同的】或【相似的】代码
微观上看:是一次一次按条件判断去执行的,只不过速度很快。
1,while循环
语法:var 变量名=循环的变量:基本是数字
while(循环条件){
循环体;
循环变量的变化;
}
死循环语法:while(true){循环体;}
2,do...while循环
语法:var 变量名=循环的变量:基本是数字
do{
循环体;
循环变量的变化;
}while(循环条件);
面试体:while循环和do...while循环的区别;
只看第一次循环条件,如果都满足则没区别;
如果都不满足,则while循环会一次都不执行,而do...while循环则会至少执行一次。
3,for循环
for(var 变量名=循环变量,循环条件,循环变量的变化){
循环体;
}
死循环语法:for(;;){循环体;}
4,退出循环语句
break -> 退出整个循环
continue -> 退出本次循环
5,forEach for in for of - 专门为遍历数组准备的
数组的基础
什么是数组:一个可以保存多个数据的集合;
何时使用:多个相关的数据,都需要集中在一个数组中;
为什么使用:一个好的数组,可以极高的提高我们的开发效率;
1,创建
第一种:直接量方式
var arr=[数据1,数据2,...];
第二种:构造函数方式
var arr=new Array(数据1,数据2,...);
缺点:当你创建了只有一个数据的数组,且这个数据是个数字时,它会创建成一个长度为整个数字的空数组。
var arr=new Array(5);则创建了一个arr.length==5的空数组;
2,调用/访问
数组名[下标];
修改/添加:数组名[下标]=新值;
当此下标没有数据时则为添加,当此下标有数据时则新值会修改覆盖掉旧值;
特殊点:访问时:下标越界,会得到undefined;
修改/添加时:下标越界,变为稀疏数组,会导致下标不连续中间没有数据的下标数值为undefined,
以后遍历时一定会得到undefined;
3,数组的三大不限制
1.不限制类型;
2.不限制长度;
3,不限制下标越界; -> 这是一个缺点,所以不推荐触发
4,数组的唯一属性:数组名.length -> 获取数组的长度
三个固定用法:末尾添加新值:arr[arr.length]=新值;
获取倒数第n个值:arr[arr.length-n];
删除倒数n个值:arr.length-=n
5,遍历数组:对数组的中的每一个数值进行【相同】或者【相似】的操作
一般我们不会去单独使用数组中的某一个数值,而是会拿出来全部使用。
而每当我需要用到全部数值时就需要遍历,语法:
for(var i=0;i<arr.length;i++){
arr[i] -> 当前次元素
}
6,数组分为索引数组和关联/哈希(hash)数组
索引数组:下标都是由数字组成的数组;
关联数组:可以自定义下标的数组;
为什么要使用关联数值: 因为索引数组的下标没有意义,不能见名知意,不便于我们查找。
如何使用:
创建:1,创建一个空数组:
var arr=[];
2,为这个空数组添加自定义下标并赋值:
arr["自定义下标"]=新值;
访问:arr["自定义下标"];
强调:hash数组的length会失效,长度永远为0;
问题:hash数组的length失效,就不能用for循环遍历。
解决:hash数组的遍历必须使用 for in循环遍历数组,比如:
for(var i in 数组名){
i -> 自动获得当前数组的所有下标,不许要我们设置从哪里开始到哪里结束;
arr[i] -> 当前次元素
}
牛逼点:不仅可以遍历hash数组,索引数组也可以使用;
但是还是建议hash数组使用for in循环,索引数组使用for循环。
js中一切东西都是对象,万物皆对象,除了undefined和null,【一切对象的底层都是hash数组】