第一天
1、数组的基础:1、构造函数创建数组:var arr=new Array(num);//创建了一个长度为num的空数组
2、按值传递:var a=x; var b=a;
如果传递的是原始类型,两者互不影响,因为是复制了一个副本给对方
如果传递的是引用类型,两者相互影响,因为是把自己的地址值给了对方 - 浅拷贝
3、释放一个引用类型,看清楚有多少个变量使用着他,全部都要释放后,才能释放干净 - 尽量的要封装为一个函数
2、hash(关联)数组:下标可以自定义的
1、创建:2步
1、创建一个空数组: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);
更推荐:
1、parseInt(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、Month、Date、Day、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();