第二周

70 阅读11分钟

创建数组

创建函数:
    1、直接量:var arr=[值1,.....]
    2、构造函数:var arr=new Array(值1,....)
面试题:
    按值传递:var a=x;  var b=a;修改ab变不变,或者修改ba变不变
    1、传递的如果是原始类型
        其实是复制了一个副本,两者互不影响
    2、传递的如果是引用类型:js中不是原始类型就是引用类型(函数、数组都是引用类型)
        因为引用类型很大,比原始类型大得多,不可能保存在变量本地,只是保存了一个地址值,其实就是赋值了自己的地址值给对方,两者用的是同一个地址值,一个改变另一个也会改变

hash数组

创建:
    1、创建空数组:var arr=[]
    2、为数组添加自定义下标,并且赋值:arr["自定义下标"]=新值
遍历hash数组
    forvar i in 数组名){
            i;//下标
            数组名[i]//当前元素
            }

数组API

arr 转 字符串
    1、 str=arr.join("自定义连接符")
    鄙视题:将数组里面的内容拼接为一句话/单词 - 无缝拼接,其实就是拼接了一个空字符串
			var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
			var str=arr.join("");
			console.log(str);
    2、组拼接为DOM页面元素 - 第一次遇到数据渲染页面
     //将数组拼接为页面标签字符串
			var str="<开始标签>"+arr.join("</结束标签><开始标签>")+"</结束标签>";
			//巧了:innerHTML能够识别标签
			sel.innerHTML=str;
    3、数组拼接:添加新元素的新方式
        将传入的实参全部          拼接到arr的末尾
        var newArr=arr.concat(新值1,arr1,...);
        特殊:
	1、不修改原数组,只会返回一个新数组
	2、concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素再拼接
    4、截取子数字
        根据传入的开始下标截取到结束下标
            var xxx=arr.slice(start,end+1)
            特殊:
                1、不修改原数组,只会返回新数组
                2、含头不含尾
                3、恩典可以省略不写,不写会从start位置一直取到末尾,start也可以不写,默认从第一个位置开始
                4、支持负数参数,-1代表倒数第一个
    4、删插替---直接修改元素组,但是被删除的东西会组成一个新数组
        删除:var xxx=arr.splice(start,n)n代表删除的个数
        插入:arr.splice(start,0,新值...)0代表删除0个
        替换:var xxx=arr.splice(start,n,新值....)
                
    5、数组排序:
        笔试题:var arr=[31,21,54,4376,69,8,8,65,643,52,3,321,5,47,69,87,643,524];
		for(var j=1;j<arr.length;j++){
			for(var i=0;i<arr.length-j;i++){
				if(arr[i]>arr[i+1]){
					var m=arr[i];
					arr[i]=arr[i+1];
					arr[i+1]=m
				}
			}
		}
		console.log(arr);
             冒泡排序,前一个元素和后一个元素对比,如果前一个大于后一个,两者交换位置
        正式开发:arr.sort(function(a,b){
                    console.log(a)//后一个数字
                    console.log(b)//前一个数字
                    return a-b
                    //如果a-b返回的是一个正数:说明后一个>前一个
                    //如果a-b返回的是一个负数,说明后一个<前一个
                    //如果a-b返回的是一个0,说明后一个==前一个
                    //而sort方法会根据你返回的正数、负数、0,来自动考虑要不要交换位置
                    })
                 如果想要降序
                     arr.sort(function(a,b){
				return b-a;
			})
             以后只要网上有功能带排序,他的底层一定是数组,因为js中只有数组可以排序
             以后网上有随机功能,他的底层一定是随机数公式
    6、栈和队列
        开头进:arr.unshift(新值...)添加元素的新方式,向前添加,会导致其他元素下标发生变化
        开头出:arr.shift()删除元素的新方式,向后删除,会导致其他元素下标发生变化
        结尾进:arr.push(新值)添加元素的新方式,向后添加
        结尾出:arr.pop()删除元素的新方式,向后删除
    7、二维数组:数组的元素,又引用着另一个数组
        创建:
            var arr=[
            [],
            [],
            []
            ]
            访问:arr[行下标][列下标]
            列下标越界,返回undefined
            行下标越界,得到报错,因为行下标越界已经得到undefined,undefined不能加[]操作
         遍历二维数组:
             两层循环:外层循环控制行,内层循环控制列
                 for(var r=0;r<arr.length;r++){
			for(var c=0;c<arr[r].length;c++){
				console.log(arr[r][c]);
			}
		}
       8、判断:2个
           every:要求所有元素都满足条件才会为true,只要有一个不满足就会为false,类似于&&
               var bool=arr.every(function(val,i,arr){
               //val-当前的值
               //i-当前值的下标
               //arr-当前数组本身
               return 判断条件
           some要求只要有一个元素满足条件就会为true,所有元素都不满足则为false,类似于||
               var bool=arr.some(function(val,i,arr){
			return 判断条件;
		})

        9、遍历:
            forEach-直接修改原数组
                arr.forEach(function(val,i,arr){
                return 操作;
                })
            map-不修改原数组返回一个新数组
                var newArr=arr.map(function(val,i,arr){
			return 直接做你想要的操作;
		})
        10、过滤和汇总:
                过滤:筛选出需要的部分,但是原数组不会发生变化
                    var subArr=arr.filter(function(val,i,arr){
			return 判断条件;
	          	})
                汇总:
                    var result=arr.reduce(function(prev,val,i,arr){
			return prev+val;
	          	},基础值)
          ES6箭头函数:简化一切匿名回调函数的:
                固定公式:function去掉,()和{}之间添加=>,如果形参只有一个,那么()可以省略,
                如果函数体只有一句话,那么{}也可以省略,如果函数体只有一句话并且是return,
                那么return和{}都可以省略

SrtringAPI

就是一些只有字符串能用的函数,不需要创建

 1、转义字符:\
 2、大小写转换
     只要程序不区分大小写,就要先统一转为大写或者小写,再比较(比如做验证码)
         大写:var xxx=str.toUpperCase()
         小写:var xxx=str.toLowerCase()
 3、获取字符串中指定位置的字符:str.charA他(i)===str[1]
 4、获取字符串中指定位置人字符串的ASCII码
     var xxx=str.charCodeAtt(ascii)
 5、检索字符串:检查索引,检查下标:获取关键字的下标
	var i=str/arr.indexOf("关键字",starti);
	从starti位置开始,查找右侧第一个关键字的第一个字符的位置
	starti可以省略,默认从0位置开始查找
	*返回值:找到了,返回第一个关键字的第一个字符的下标位置
		没找到,返回-1,其实我们根本不关心下标为多少,我们只关心下标为不为-1
	作用:判断有没有!
	强调:数组也能使用此方法,数组这个方法是后期才添加 上的,原本此方法只有字符串可用,比如老IE的数组就没此方法。
	鄙视题:默认只能获取到第一个关键字的下标,如何才能获取到所有的关键字的下标?
		var str="no zuo no die no can no bibi no";
		var index=-1;
		while((index=str.indexOf("no",index+1))!=-1){
			console.log("找到了,下标为:"+index);
		}
 6、拼接字符串:
     var xxx=str.concat(“新字符串”.....)--不如+运算
 7、截取字符串:3个
     var xxx=str/arr.slice(start,end+1)用法几乎和数组的一样
     var xxx=str.substring(start,end+1)用法几乎和slice一致,但是不支持负值参数
     var xxx=substr(start,n)n代表截取的个数,不必考虑含头不含尾
 8、替换字符串
     var xxx=str.replace(“固定关键字”/正则表达式,“新内容”)
 9、切割/分割/分隔字符串
     作用:将字符串转为数组
     var arr=str.split(“自定义切割符”)
     注意:
         1、切割后,切割符就不存在了
         2、如果切割符是“ ”,切散每一个字符
 10、去掉空白字符
     str.trim/trimStart/trimEnd()

Math对象

API1、取整
        1、上取整:超过一点点,就取下一个整数
            var xxx=Math.ceil(num)//小数点不能超过15位,否则只能取整,不能上取整
        2、下取整:不管超过多少,都会省略小数部分
            var xxx=Math.floor(num)
        3、四舍五入取整
            var xxx=Math.round(num)//只看小数第一位
         除了以上三种,parseInt(str去掉单位)
                     num.toFixed(d)
            num.toFixed(d)
                优点:
                    1、可以四舍五入,并且保留指定小数位数,d就是保留的小数位数
                    2、解决浏览器带来的舍入误差,比如:2-1.6=0.399999999999999,这种情况就可以用toFixed来解决
                缺点:结果是一个字符串,建议搭配上parseFloat()使用
                鄙视题:不允许使用toFixed的情况下,自己封装一个函数,由用户传入数字和保留位数,实现四舍五入操作:
			function toFixed(num,d){
				num*=(10**d);
				num=Math.round(num);
				num/=(10**d);
				return num;
			}
			var result=toFixed(Math.PI,2);
			console.log(result);
    2、乘方开方
        乘方:Math.pow(底数,幂)===>简写:底数**幂
        开方:Math.sqrt(num)--只能开平方
    3、最大值和最小值
        var max/min=Math.max/min(a,b,c,d,e,....)//自动再传入的数字中比较出最大或最小值
         问题:本身不支持数组参数
         解决:固定用法:Math.max/min.applyMath,arr)//apply具有打散数组的功能
    4、随机数
        公式:parseIntMath.random()*(max-min+1)+min)

日期对象

创建:41*创建一个当前日期:
	var now=new Date();

2*创建一个自定义时间:
	var birth=new Date("yyyy/MM/dd hh:mm:ss");

3、创建一个自定义时间:
	var birth=new Date(yyyy,MM,dd,hh,mm,ss);//修改月份,从0~110代表14、复制一个日期:
	日期的所有API都是直接修改原日期的,无法获得修改之前的日期
	在执行API之前先进行复制,然后再操作复制后的日期
		var end=new Date(start);
     使用:21、两个日期对象之间,可以相减(大-小),得到一个毫秒差,换算出自己想要的任何一部分 - 日期的本质其实就是保存了一个毫秒数 - 做倒计时的关键
	创建日期的最后一种方式,绝对没人用:var date=new Date(毫秒数);//计算机元年:1970118点整

        2、API:
	分量:时间的单位
	年月日星期:FullYear Month Date Day
	时分秒毫秒:Hours Minutes Seconds Milliseconds
	每一个分量都有一对儿getXXX/setXXX的方法
		其中getXXX负责获取一个分量的值
		其中setXXX负责设置一个分量的值
	特殊:
		1、取值范围:
			FullYear - 当前年份的数字
			Month - 0~11
			Date - 1~31
			Day - 0~60代表是星期天,外国人的眼里星期天才是一周的第一天的
			Hours - 0~23
			Minutes、Seconds:0~59
			日期你知道了取值范围,如果你还故意设置超出范围,他很聪明,会自动进制
		2Day,没有set方法

		3、如果希望对某个分量进行加减操作:
			date.setXXX(date.getXXX()+/-n)

		4、格式化日期为本地字符串:
			date.toLocaleString(); 具有兼容性问题,一般会选择自己创建一个格式化方法来格式日期
			用了此方法会失去一些东西:日期的自动进制、日期的API
			但是你也会获得一些东西:字符串的API   

定时器

1、周期性定时器:每过一段时间就会执行一次,先等后做
	开启:timer=setInterval(callback,间隔毫秒数);
	停止:clearInterval(timer);

2、一次性定时器:等待一段时间,只会做一次就结束了
	开启:timer=setTimeout(callback,间隔毫秒数);
	停止:clearTimeout(timer);

BOM

Browser Object Model-浏览器对象类型:专门用于操作浏览器,远不如ES和DOM

    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();