第二周js学习

57 阅读7分钟

第一天

1、数组的基础:
1、构造函数创建数组:var arr=new Array(num);//创建了一个长度为num的空数组

2、按值传递:var a=x; var b=a;
	如果传递的是原始类型,两者互不影响,因为是复制了一个副本给对方

	如果传递的是引用类型,两者相互影响,因为是把自己的地址值给了对方 - 浅拷贝

3、释放一个引用类型,看清楚有多少个变量使用着他,全部都要释放后,才能释放干净 - 尽量的要封装为一个函数

2、hash(关联)数组:下标可以自定义的

1、创建:21、创建一个空数组:var arr=[];
	2、添加自定义下标并且赋值:arr["自定义下标"]=新值;

2、访问:arr["自定义下标"];

3、length失效了,永远为0!遍历不能用for循环,必须使用for in
	for(var i in arr){
		i;//自动得到每一个下标
		arr[i];//每一个元素
	}

3、数组的API:这些方法只有数组可以使用

1、arr to str:var str=arr.join("自定义连接符");
	1、无缝拼接:var str=arr.join("");

	2、拼接为页面元素:var str="<开始>"+arr.join("<结束><开始>")+"<结束>";

2、拼接数组:添加的元素的新方式
	var newArr=arr.concat(新值1,...,arr2);

3、截取子数组:取出一部分来使用
	var subArr=arr.slice(starti,endi+1);

4、删插替:var dels=arr.splice(starti,n,新值1,...);

5、翻转数组:arr.reverse();

6、排序:
	arr.sort();//按字符串排序
	arr.sort(function(a,b){return a-b});//数字升序
	arr.sort(function(a,b){return b-a});//数字降序

第二天

1、数组的API:
栈(一端封闭、另一端进出 - 优先使用最新的数据)和队列(一端进,另一端出 - 按照先来后到的顺序)
	开头进:arr.unshift(新值1,...);
	开头出:var first=arr.shift();

	结尾进:arr.push(新值1,...);
	结尾出:var last=arr.pop();

2、二维数组:

var arr=[[],[],[],[]];

访问:arr[行下标][列下标];
	列下标越界,得到undefined
	行下标越界,得到一个报错

遍历二维数组:
	for(var r=0;r<arr.length;r++){
		for(var c=0;c<arr[r].length;c++){
			arr[r][c];//每一个元素
		}
	}

3、新的API:

判断:var bool=arr.every/some((val,i,arr)=>判断条件);

遍历:arr.forEach((val,i,arr)=>操作);
           var newArr=arr.map((val,i,arr)=>操作);

过滤:var subArr=arr.filter((val,i,arr)=>判断条件);
汇总:var sum=arr.reduce((prev,val,i,arr)=>prev+val);

第三天

String API:
1、转义字符:\
	1、解决和程序冲突的字符
		"\""

	2、换行:\n	制表符:\t

	3、书写unicode编码的文字:\uXXXX

2、大小写转换:var newStr=str.toUpper/LowerCase();

3、获取某个位置的字符:str.charAt(i) 还不如 str[i]

4、获取某个位置的字符的ascii码
	var ascii=str.charCodeAt(i);
     转会原文:
	var 原文=String.fromCharCode(ascii);

5、检索字符串:判断有没有,数组也可以使用
	var i=str/arr.indexOf("关键字",starti);
	为不为-1,为-1说明没有,不为-1说明有

6、拼接字符串:var newStr=str.concat("新字符串",...) 还不如+运算

7、截取字符串:3个
	var subStr=str/arr.slice(starti,endi+1);
		             .substring(starti,endi+1);//不支持负数参数
		             .substr(starti,n);//n代表截取的个数,不必考虑含头不含尾

8、替换字符串:
	var newStr=str.replace("固定关键字","新内容");
	
9、切割字符串:arr<=>str
	var arr=str.split("自定义切割符");

10、去掉空白字符:
	var newStr=str.trim/trimStart/trimEnd();

扩展:创建元素的步骤:3步

1、创建空标签:var x=document.createElement("标签名");

2、为其设置必要的属性和事件
	x.属性名="属性值";
	x.on事件名=function(){操作}

3、上树:父元素.appendChild(x);

第四天

1、Math:数学对象,不需要创建,可以直接使用
1、属性:Math.PI

2、API:
	1、取整:
		上取整:Math.ceil(num) - 小数位数不能超过15位
		下取整:Math.floor(num);
		四舍五入:Math.round(num);
		更推荐:
			1parseInt(str);
			2、num.toFixed(d);//具有四舍五入的功能,并且小数位数自己规定,但是返回的是一个字符串,建议搭配parseFloat使用

	2、乘方:Math.pow(底数,幂) ===> 底数**幂;
	     开平方:Math.sqrt(num);

	3、最大值和最小值:
		Math.max/min(一堆数字);
		默认不支持数组比较:
		解决:Math.max/min.apply(Math,arr);

	4、绝对值:Math.abs(负数);

	5、随机整数:parseInt(Math.random()*(max-min+1)+min);

2、Date:日期对象

1、创建:
	1、获得当前时间:
		var now=new Date();

	2、自定义时间:
		var date=new Date("yyyy/MM/dd hh:mm:ss");
		var date=new Date(yyyy,MM-1,dd,hh,mm,ss);

	3、复制日期:
		var end=new Date(start);

2、操作:
	1、两个日期之间可以相减,可以得到一个毫秒差,换算出我们想要的部分

	2、API:FullYear、MonthDateDay、Hours、Minutes、Seconds、MilliSeconds
		每一个分量都有一对儿getXXX/setXXX,除了Day没有set操作

	3、自己格式化

3、定时器:

周期性|一次性:
	开启:timer=setInterval/Timeout(()=>{操作},间隔毫秒数);
	停止:clearInterval/Timeout(timer);
	timer保存的是定时器的序号,数字:0 1 2 3 4 5

第五天

1、BOM:Browser Object Model - 浏览器对象模型:专门用于操作浏览器的,但是它使用的不多,远不如ES和DOM,浏览器很多操作都是自带的,而且BOM没有标准, 各个浏览器都有自己的定义,但是大部分浏览器的都是一致规范的,除了老IE(8-)

2、window对象:扮演着两个角色: 1、全局对象:保存着全局变量和全局函数 2、指代当前窗口本身:

属性:
	1、获取浏览器的完整大小:outerWidth/outerHeight
	2、*获取浏览器的文档显示区域的大小:innerWidth/innerHeight - 获取每台电脑的浏览器的文档显示区的大小
	3、获取屏幕的完整大小:跟window没关系:screen.width/height; - 我们目前学习的都是浏览器应用(网页),并不会去做桌面应用

方法:
	1、*打开链接的新方式:
		1、当前窗口打开,可以后退:
			HTML:<a href="url">内容</a>
			       JS:open("url","_self");

		2、当前窗口打开,禁止后退:使用场景:比如电商网站,结账后不允许后退
			HTML做不到了,只有JS可以,也不是window能做到的,而是另外一个人:
			history:当前【窗口的历史记录】,他其实可以做的事儿就是前进后退
			location:当前【窗口正在打开的url】,有一个API:
				location.replace("新url");//叫做替换,不叫做跳转,不会产生历史记录,自然也不能后退了,但是网址替换了,网页必然会发生变化

		3、新窗口打开,可以打开多个
			HTML:<a href="url" target="_blank">内容</a>
			       JS:open("url","_blank");

		4、新窗口打开,只能打开一个:使用场景:比如电商网站,只允许用户打开一个结账页面
			HTML:<a href="url" target="自定义一个name">内容</a>
			       JS:open("url","自定义一个name");

		     其实窗口的底层都是有一个名字的,如果打开了一个已经开着的名字的窗口的,他会把他关闭掉,再次打开

		学完这块,我们知道了两个点:
			1、以后的跳转,任何标签都可以
			2、提升用户的体验感
			3、a标签的其他用途:
				1、跳转
				2、锚点
				3、下载按钮:<a href="xx.exe/rar/zip/7z">下载</a>
				4、打开图片和txt文档:<a href="xx.png/jpg/jpeg/gif/txt">打开图片和txt</a>
				5、直接书写js-不需要绑定点击事件:<a href="javascript:js代码;">打开图片和txt</a>

	2、打开新窗口/新链接:newW=open("url","target","width=?,height=?,left=?,top=?");
			特殊:1、如果没有加第三个参数,那么窗口会和浏览器融为一体
			          2、如果你加了第三个参数,那么窗口会脱离浏览器独立存在
	3、关闭窗口:window/newW.close();
	4、改变新窗口的大小:newW.resizeTo(新宽,新高);
	5、改变新窗口的位置:newW.moveTo(新X,新Y);
	6、*window提供了三个框:
		警告框:alert("警告文字");
		输入框:var user=prompt("提示文字");
		确认框:var bool=confirm("提示文字");
	7、*****定时器也是window的
	8、事件:
		1、window.onload事件 - load - 加载:等待其他所有的资源加载完毕后才会执行的代码,放在里面的代码其实要最后才会执行
		2、*window.onresize事件 - 窗口如果大小发生了变化,就会触发,搭配上判断innerWidth可以理解为是js版本的css媒体查询
		3、***window.onscroll事件 - 滚动事件,一旦滚动就会触发
			1、获取滚动条当前的位置:window.scrollY
			2、获取元素距离页面顶部有多远:elem.offsetTop/offsetLeft
	9、*****本地/客户端存储技术:
		cookie:淘汰了,存储的大小只有2kb,而且操作极其麻烦,尤其要到处切割,只能最多保存30天
		webStorage:H5带来了一个新特性,存储的大小有8mb,永久保存,而且非常简单
			分类2种:
			1、sessionStorage - 会话级,只要浏览器一旦关闭,数据就会死亡了
			2、localStorage - 本地即,只要你不清空,就会永久存在
			两者的用法是一模一样的,不用创建,直接可用
			操作:

			1、添加:xxxStorage.属性名="属性值";
			2、读取:xxxStorage.属性名;
			3、删除:xxxStorage.removeItem("属性名");
			4、清空:xxxStorage.clear();