第一天
一、数组的基础:
1、创建数组:
直接量方式:
var arr=[值1,值2...];
构造函数:
var arr=new Array(值1,值2..);
构造函数的坑:new Array(num);
这这句话的意思是:创建了一个长度为num的空数组,里面没有任何东西,只有无数的undefined;
*******面试题
按值传递:
值的原始类型 有五个:number, string,bolean,null,undefined
var a=x;var b=a;修改a,b变不变?修改b,a变不变?
如果传递的是原始类型:其实就是复制了一个副本给对方,两者互不影响;
如果传递的值是一个引用类型(js中不是原始类型就是引用类型,string和number是两者兼具的二五仔):引用类型传值实际上的将自己的地址值传给对方了,两者改变都会影响到对方;
2、如何释放一个引用类型:
一定要看清楚有几个变量引用这个引用类型,需要将每个变量都释放干净才行,封装的函数可以直接全部释放变量;
js的底层其实有一个垃圾回收站的计数器(记录每个数据有几个人咋使用),当计数器为0时(没有人引用了),才会删除不要的数据。
尽量将我们的代码封装成函数,函数在执行完毕后会自动释放;
索引数组:下标都是数字的数组;
重点来喽!!!!
二、hash数组:(关联数组):下标是可以自定义的;
索引数组的小标无具体的意义,不利于查找使用;
使用:
1、创建:
var arr=[];
为数组添加自定义下标并赋值;
arr["自定义下标"]=新值;
访问元素:
arr["自定义下标"];
强调:此时hash数组的length失效二楼,永远为0;
遍历hash数组:
for(var i in 数组名)
{
i;//下标
数组名[i];//当前次元素
}
以上 for in 遍历方法不止能遍历hash数组,还能遍历索引数组
hash数组的原理:
hash算法:将字符串计算出一个尽量不重复的数字(地址值),字符串内容不同,则计算出来的数字(地址值)也不同;
在JS中,除了undefined和null,其他的都是对象
# 超重点来了!!!API
数组的API:
1、arr转为str:将数组转为字符串
var str=arr.join("自定义连接符");
固定套路:
1、笔试题: 将数组的内容拼接为一句话
var arr=["h","e","l","l","o","","w","o","r","l","d"];
var str=arr.join("");
console.log(str);
2、将数组拼接为DOM元素:
var arr=["请选择","北京","上海"];
var str="<option>"+arr.join("</option><option>")+"</ooption>";
sel.innerHTML=str;
3、数组拼接,添加元素的新方式
将你传入的实参全部拼接到arr的末尾;
var newArr=arr.concat(新值1,arr1,...);'
特殊:
1、不修改原数组,只会返回一个新数组
2、concat支持传入数组参数,请将传入的数组打散为单个元素再拼接
4、截取子元素:
根据传入的下标接取到结束的下标:
var subArr=arr.slice(stri,endi+1);
特殊:
1、不修改原数组,只会返回一个新数组,
2、含头不含尾
3、endi可以省略不写,会从starti的位置一直截取到末尾
4、starti也可以省略,如果两个实参都省略不写,那会从头到尾完全的复制一份
此操作也叫深拷贝--复制一个副本给对方
5、支持负数参数,-1代表倒数第一个
5、删插替:
删除:
var dels=arr.splice(starti,n)//n代表删几个
特殊:
返回值是被删除的数据组成的一个新数组,可以用一个变量来接住它;
插入:
arr.splice(starti,0,新值....);
特殊:
1、元starti位置的元素以及后续元素都会向后移动
2、尽量不要插入一个数组,因为插入的数组还是会显示数组,从而出现一维数组和二维数组,遍历起来很麻烦
替换:
arr.splice(starti,n,新值...);
特殊:
删除的个数和删除的个数不必相同
反转数组: arr.reverse();
数组排序:
1、笔试题:冒泡排序
使用冒泡排序,前一个和后一个比较,若是前一个比后一个大,则交换位置,做完一轮之后只会发现最大值到了最后面,需要反复的开循环执行;
固定公式:
var arr=[12,3,,43,4,546,6,7,8,78,32];
for(var j=0;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);
2、实际运用:
arr.sort()//排序
默认:将数组的元素转换为字符串再按位PK每个字符的unicode号;
问题1:希望数字升序排列
arr.sort(function(a,b){
console.log(a);
console.log(b);
return a-b;//升序排列
return b-a;//降序排列
})
如果a-b>0,说明前一个大于后一个
a-b<0,说明前一个小于后一个
a-b=0,说明a==b;
问题2:希望数字降序排列
arr.sort(function(){
return b-a;
})
强调:
1、网页上具有排序功能的底层一定是数组,因为JS只有数组可以排序
2、网页上具有随机数功能的,底层一定是用了随机数公式
公式:
var r=parseInt(Math.random()*(max-min+1)-min);
栈和队列:添加和删除元素的新方式
栈其实就是数组,只不过一段封闭了,只能从一端出来,优先使用最新的数据(最后放进去的)
如何使用:
开头进,开头出:
开头进入:arr.unshift(新值);
开头出去:var first=shift();
结尾进,结尾出:
结尾进:arr.push();
结尾出去:var last=arr.push();
2、队列:其实还是数组,只不过一端进从另外一端出
开头进结尾出:
开头进:arr.unshift(新值); 结尾出去:var last=arr.push();
结尾进开头出:
结尾进入:arr.push(); 开头出去:var first=shift();
******重点
周期定时器:每过一段时间执行
开启:timer=serInteral(function(){操作});
停止:clearInterval(timer);
鼠标移入:onmouseover
鼠标移出:onmouout
3、二维数组:数组的元素有引用这另外一个数组
创建:
var arr=[["李白",18,2000],["张三",19,200],["李四",67,7000]];
访问:
arr[行下标][列下标];
特殊:列下标越界会返回一个undefined
行下标越界会报错
遍历二维数组
两层循环:外层循环控制行,内层循环控制列
for (var r=0;r<arr.length;i++){
for(var c=0;c<arr[r].length;c++){
consolo.log(arr[r][c]);
}
}
ES5的六个API
1、判断: every:每一个,需要每一个都满足才会返回true;
var bool=arr.every(function(val,i,arr){
val//指代的是当前值
i//指代当前值的下标
arr//单签数组本身
return 判断条件
})
some:有一些,有一个满足就为true
var bool=arr.some(function(val,i,arr){
判断条件;
})
2、遍历:拿到数组中的每一个元素
forEach();直接修改原数组
arr.forEach(function(val,i,arr){ 操作; })
map--不修改原数组,返回一个新数组
var newArr=arr.map(function(val,i,arr){{
return 操作;
})
3、过滤和汇总
过滤:就是所需的部分,原数组不改变
var sbArr=arr.filter(function(val,i,arr){
return 判断条件
})
汇总:
var result=arr.reducce=arr.reduce(function(pre,val,i,arr){
return prev+val;//也可以是其他运算
},基础值)
String字符串API
1、转移字符串:
作用:
1、将字符串中和程序中冲突的字符转为原文:“\”;
2、包含特殊功能的符号
换行:\n;
制表符:\t,大空格
3、转出unicode编码的字符
\u4e00 ascii码:19968
\u9fa5 ascii码:40869
大小写转换:将字符统一转为大写或小写
大写:var upper=str.toUpperCase();
小写:var upper=str.toLowerCase();
3、获取字符串中指定位置的字符
str.charAt(i)===str[i];//这两个是全等的,可以简便写法
4、获取字符串中指定位置的ascii码
var ascii=str.charCodeAt(i);
通过ASCII码转回原文
var 原文=String.fromcharCodeAt(ascii);
***5、检索字符串
检查索引,检查下标:获取关键字的下标
var index=str.indexOf("关键字",starti);
从starti位置开始,查找右侧第一个关键字的第一个字符的位置,starti可以省略,默认从0开始
返回值:找到了返回第一个关键字和第一个字符的下标位置
没找到则返回-1,只需要关心下表部位-1;
作用:判断由还是没有
强调:数组也能使用此方法,原本只有字符串可以用,数组是后面加上去的
笔试题:
默认只能获取第一个关键字的下标,如何才能获取所有关键字的下标?
var str="no zuo no die no can no bibi";
var index=1;
while(index=str.indexOf("no",index+1)!=-1){
console.log("找到二零,下表为:"+index);
}
6、拼接字符串:
var newStr=str.concat("新字符串");
7、***截取字符串
var subStr=str.slice(starti,endi,+1);
str.subStr(starti,n)l
8、***替换字符串:
var newStr=str.replace("固定关键字"/正则,”新内容“);
9、******切割/分割/分隔字符串 ***
作用:将字符串转为数组:
var arr=str.split("自定义切割符号");
注意:
1、切割后,切割符号就不存在了
2、如果切割的符号是" ",则切散每一个字符
10、去掉空白字符:
str.trim 去掉前后的空白
str.trimStart 去掉前面的空白
str.trimEnd 去掉后面的空白
拓展:
JS如何创建元素:
1、创建空标签:
var elem=document.createElement("标签名");
2、为其设置必要的属性和事件
elem.属性名="属性值";
elem.on事件名=function(){操作;}
3、挂载上树/渲染页面
父元素:appendChild(elem);
1、Math对象:
API:
1、上取整,超过一点点就去下一个整数
var num=Math.ceil(num);
2、下取整:无论超过多少都省略小数
var num=Math.floor(num);
3、四舍五入取整
var num=Math.round(num);//只看小数第一位
重点来喽
num=toFixed(d); d代表的保留小数位数
优点:可以四舍五入:并且保留指定小数位数
结果是字符串,搭配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);
乘方和开方:
乘方:Math.pow(底数,幂);//简化:底数*幂
开方:Math.sqrt(num);//只能开平方
3、最大值和最小值
var max/min=Math.max/min(值);
问题:本身不支持数组参数
解决:固定方法
Math.max/min.apply(Math,arr);
4、绝对值:把负数转为正数
Math.abs(-1);
5、随机数:
Math.random();在0-1之间取一个随机的小数
搭配上:parseInt,只能取到0,不能到1,就取不到最大值;
公式:parseInt(Math.random()*(max-min+1)-min)
强调:页面有随机数,底层一定是随机数
2、Date对象:日期,提供操作日期和时间的API
创建:
var now=new Date();
2、创建一个自定义时间
var birth=new Date(“yyyy/MM/dd hh:mm:ss”)
3、创建一个自定义时间
var birth=new Date(yyyy,MM,DD);
4、复制日期
在执行之前,先复制再操作
var end=new Date(start);
使用:两类
1、两个日期对象之间,可以相减,得到一个毫秒差,换算出自己想要的一部分
2、API:
分量:时间的单位
FullYear Month Date Day
时分秒毫秒:Hours Minutes Seconds Millionseconds
每一个fldou有一对getXXX/setXXX的方法
其中:getXXX是用来获取一个分量的值;
setXXX是用来设置一个分量的值;
日期API的特殊点:
1、取值范围
FullYear-->当前年份的数字
Month0-->0-11
Date-->1-31
Day-->0-6,0是代表的星期天
2、Day,没有set方法,但有get方法
3、对某个分量进行加减操作
date.setFullYear(date.getFullYear()+3);//加了三年后的时间
4、格式化日期本地字符串
date.toLocaleString();//不好用,兼容性差
会失去日期的自动进制和日期的API,但是也会获得一些,字符串的API
定时器:定时器是一个异步技术
1、周期性定时器:每过一段时间就会执行一次,先等后做
开启:timer=setInterval(callbakc,时间毫秒数)
停止:clearInterval(timer);
2、一次性定时器
开启:timer=setTimeOut(callback)
关闭:clearTimeOut(timer);
1、BOM对象:浏览器对象模型
2、window对象
1、全局对象:保存着全局变量和全局函数
2、只带当前对象本身
属性:
1、获取浏览器的完整性大小
outerWidth/outerHeight
2、获取浏览器的完整大小(显示区域)
innerWidth/innerHeight
3、获取屏幕的完整性大小
screen.with/height
方法:
1、打开链接的方式:
当前窗口打开,可以后退
open("url","_self")还有a标签
2、当前窗口打开,禁止后退
history: 当前窗口历史记录,可以前进和后退
location:当前窗口正在打开的url,有一个API
location.replace("新url");不会产生历史记录也不能后退,网址发生替换
3、新窗口打开、可以打开多个
HTML:<a href="url" target="_blank"><a>
新窗口打开:只能打开一个
HTML:<a href="url" target="自定义的name"></a>
JS:open("url","自定义name");
a标签可作为下载按钮
href 里面放入XX.exe,XX.rar,XX.ZIP 同时也能打开图片和txt文档
a标签还可以直接书写JS代码
<a href="javascript:JS代码"><a>
2、打开新窗口/新链接
newW=open("url","target",width=?,height=?,left=?,top=?)
特殊:如果没有第三个参数,窗口和浏览器会融为一体
如果加了第三个参数,窗口会脱离浏览器独立存在
3、改变窗口的位置:
newW.moveTo(新X,新Y);
4、确认框:
var bool=confirm(“提示文字”);
5、事件:
1、window.onload事件,等待其他的执行完之后才会执行的代码
2、window.onresize事件,如果窗口发生变化就会触控,搭配上判断innerWidth使用
6、***滚动事件 -->一旦滚动就会触发
1、获取滚动条当前的位置
window.scollY
2、获取元素距离页面顶部/左侧有多远
elem.offsetTop/offsetLeft
9、******本地存储
cookie:淘汰了的东西
webStorage:Hs的新属性,有8m的存储,还能永久保存
Storage分为两类:
1、sessionStorage--会话级,只要浏览器关闭,里面存储的数据就会死亡
2、localStorage--本地级,只要不清空就会永久保存
操作:
1、添加:xxxStorage.属性名=“属性值”;
2、读取:xxxStorage.属性名;
3、删除:xxxStorage.removeItem(“属性名”);
4、清空:xxxStorage.clear();