JavaScript day008

105 阅读3分钟

*循环结构:

1、*var 变量=几;while(循环条件){循环体;变量的变化}
	
2var 变量=几;
	      do{
		循环体;
		变量的变化
	      }while(循环条件)
	
3、*for(var 变量=几;循环条件;变量的变化){
		循环体;
	      }
	
4、*退出循环:
		break - 退出整个循环
		continue - 退出本次循环

	
5、死循环:
		while(1){}
		for(;;){}

面试题(while和do...while的区别?)

面试题:whiledo...while的区别?
只看第一次,如果条件都满足,则没区别
如果条件不满足,则while一次都不会执行,do...while至少会执行一次

*数组的基础:

1、概念:什么是数组:

概念:
什么是数组;一个内存(变量)中保存多个数据的一个集合结构

何时:只要存储的多个相关的数据,都要用数组集中保存
为什么:一个好的数据结构,可以极大的提升程序员的开发效率

2、创建:2种

1.*直接量:var arr=[值1,....];

2.构造函数:var arr=new Array(值1,....); - 有一个坑new Array(num);//创建了一个长度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、创建:21、先创建一个空数组: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);//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>

二级联动案例.png