数组的基础
1.创建数组:
1、直接量方式:var arr=[]
2、构造函数方式:var arr=new Array()
第二个方法有一个坑:若是只写上一个数字的话,那么则表示创建了一个num长度的空数组;里面只有无数的undefined;
面试题:按值传递:var a=x,b=a;修改a,b变不变,修改b,a变不变?
要看传递的是什么类型的值,如果是原始类型,那么是创建了一个副本给对方,两者互不影响;若是引用类型的值,引用类型很大,不会直接保存在变量本地,只是保存了一个地址值,而赋值只是把自己的地址值给到了对方,那么修改一个另一个就会发生相应的变化。
引用类型在做比较时,比较的其实是两者的地址值
面试题:如何释放一个引用类型?
一定要看清楚有几个变量引用这个数据类型,要每个变量都释放后才能彻底释放干净。
在JS的底层有一个垃圾回收器:只有垃圾回收器为0的时候才会删除不要的数据
hash(关联数组)可以自定义下标:
1、创建:
第一步:先创建一个空数组;
第二步:为数组添加自定义下标且赋值arr["自定义"]=新值
2、访问:
arr["自定义下标"];
3、强调;hash数组的长度失效,永远为0
4、遍历:遍历hash数组就不用for循环了,使用for in循环,不需要设置开始和结束,自动化专门用来遍历hash数组的;也可以用来遍历所有数组
for(var x in arr){}
JS的一切东西都是对象,除了null和undefined,一切对象的底层都是hash数组。
数组的API
1、数组转为字符串:
var str=arr.join("自定义连接符“)
固定套路:1、笔试题:将数组的内容拼接为一句话,其实是拼接了一个空的字符串:
var arr=["h","e","l","l","o"];
console.log(arr.join(""));//结果为hello
将数组拼接为页面的dom元素,数据渲染的基础
var arr=["请选择","北京","上海","重庆"];
var str="<option>"+"arr.join(</option><option>")+"</option>";
sel1.innerHTML=str;
2、拼接数组:
将你传入的实参全部拼接到数组的末尾;
var newArr=arr.concat(新值,arr1....);
特殊:
1、不会修改原数组,会返回一个新的数组;
2、支持传入数组参数,会将传入的数组打散为单个元素再进行拼接;
3、截取子数组:根据你传入的开始下标一直截取到结束下标
var subArr=arr.slice(starti,endi+1);
特殊:
1、不修改原数组,只返回一个新的数组;
2、含头不含尾;
3、endi可以省略不写,如果省略不写的话就是从starti一直截取到结束下标;
4、两个都省略的话,则是从头到尾都要拷贝一份,叫做深拷贝;
5、支持负数参数,-1代表的是倒数第一个;
4、删除插入替换
1、删除:
var dels=arr.splice(starti,n)//n代表你要删除几个
特殊:
虽然都是直接修改原数组,但是也有返回值,返回的是被删除的元素组成的新数组,没有删除则为空数组
2、插入:
var dels=arr.splice(starti,0,新值...)
特殊:
原start的位置以及后续元素都会往后移动。
尽量不要插入数组,会造成二维数组和一维数组杂糅的情况,遍历就会很不方便
3、替换
var dels=arr.splice(starti,n,新值...)
特殊:插入的元素和删除的元素个数不必相等
5、arr.reverse
6、数组的排序
1、冒泡排序:
for(j=1;j<arr.length;j++){
for(i=0;i<arr.length-j;i++){
if(arr[i]>arr[i+1]){
max=arr[i+1];
arr[i+1]=arr[i];
arr[i]=max;
}
}
}
正式开发中一般使用:arr.sort()
默认:将数组中的元素转换为字符串然后按位比较ASCII码
升序排列:
arr.sort(function(a,b){
return a-b;
})
其中此函数为匿名回调函数,a代表的是后一个,b代表的是前一个;函数不需要调用,只需要我们传入形参。
降序排列:
arr.sort(function(a,b){return b-a})
7、栈和运算
开头进:arr.unshift(新值,..)向前添加,会改变下标
开头出:arr.shift;向前删除,会改变下标,一次只能删除一个,会返回一个被删除的数
结尾进:arr.push;向后添加,不改变下标
结尾出:arr.pop;向后删除,一次只能删除一个,会返回一个被删除的数
队列:只能一端进入在另一端出去;
开头进和结尾出,开头出和结尾进混合使用就行了。
8、判断
判断的结果一定是一个布尔值;
every:要求所有的元素都满足,结果才为true,否则一个不满足就为false,类似于&&
var bool=arr.every(function(val,i,arr){
return 判断条件
})
其中val表示当前值,i表示当前值的下标,arr表示当前数组本身;
some:只要有一个结果满足结果就为ture,除非所有的结果都不满足则为false,类似于||
var bool=arr.some(function(val,i,arr){
return 判断条件
})
9、遍历
拿到数组中的每个元素做相同或者相似的操作;
forEach-改变原数组
arr.forEach(functio((val,i,arr){
操作
})
map-不修改原数组,返回一个新的数组
var newArr=arr.map(function(val,i,arr){
return 操作
})
10、过滤和汇总
过滤:筛选出你需要的部分,但是元素组不会变化
var newArr=arr.filter(function(val,i,arr){
return 判断条件
})
汇总:
var sum=srr.reduce(function(prev,val,i,arr){
prev+val
})
其中prev代表前一个,操作可以累加累减累*都可以
箭头函数
function可以省略,(){}之间添加一个=>,如果形参只有一个,那么()也可以省略,弱国函数体只有一句话,那么{}也可以省略,如果函数体只有一句话且是return的话,那么return和{}都可以省略。
arr.forEach(functio((val,i,arr){
console.log(arr[i])
})变成下面
arr.forEach(val,i)=>console.log(arr[i]);//就算是只用到了i,但是前面的参数也不能够省略,因为需要一一对应。
二维数组:
数组的元素又引用着另一个数组
var arr=[[],[],[]]
访问:arr[行下标][列下标] 特殊:如果列下标越界的话,那么会得到一个undefined,如果行下标越界的话,那么会得到一个报错;因为行下标越界已经得到了一个undefined,而undefined不能够加上[];
遍历二维数组:两层循环,外循环控制行,内循环控制列
for(var i=0 ;i<arr.length;i++){
for(var j=0; j<arr[i].length;j++){
console.log(arr[i][j])
}
}
String的概念
多个字符组成的只读字符数组:
和数组的相同点:
1、字符串的个数:str.length;
2、获取到某个字符:str[i];
3、遍历
4、所有数组中不修改原数组的API都能使用(concat、slice)
引用类型(对象类型):11个
string number boolean=>具有包装类型 Array(数组) Function(函数) Date(日期) Math(数学) RegExp(正则) Error(错误) object(对象)
glober全局对象:不需要我们创建,但是在js中被window给代替了,window在js中可以省略,包含着全局函数和全局变量;
包装类型:专门用于将一个原始类型转换成引用类型的对象的
为什么:因为原始类型没有任何的方法和属性,不支持操作,为了方便操作,将这三个原始类型在使用方法时自动转换成了包装类型,调用完毕之后,自动转回原始类型;
null和undefined未提供包装类型
扩展:select提供了专属事件:onchange,在option进行切换到时候会触发;
select的专属属性:selectIndex,获取下标只有select能用;
定时器:
设置:timer=setInterval(function(){
操作;
},间隔毫秒)
停止:clearIntervar(timer)
鼠标移入:ommouseover;
鼠标移出:onmouseout;
String的API
1、转义字符:
\:将字符串和程序冲突的字符转为原文
包含特殊功能的字符:\n
输出Unicode编码的字符:
汉字的第一个字:\u4e00=>ascii;19968
\u9fa5=>ascii:40869;
2、大小写转换
将字符串的英文字符统一改写为大写或者小写
var 大写=str.toUpperCase()
var 小写=str.toLowerCase()
4、获取指定位置的ASCII码:
var asc=str.charCodeAt(i);
通过ASCII码转会原文:
var 原文=str.fromcharCode(ascii)
5、检索字符串:获取关键字的下标
var i=str/arr.indexOf("关键词",starti);
从starti开始,从左到右查找,第一个的关键词的第一个字符下标;没找到就会返回一个 -1;主要用来查找字符串中有没有
强调:ie8之前的数组都没有这个方法
笔试题:默认只能获取第一个关键词的下标,那么如何获得所有关键词的下标
var str="no zuo no die no can no bb"
var index=-1;
while((index=str.indexOf("no",index+1))!=-1){
console.log("找到了no"+index);
}
7、截取字符串:3种
var newStr=str.slice(starti,endi+1)//含头不含尾
var str.subString(starti,endi+1)//与slice一样,但是不支持负数参数
str.substr(starti,n)//n代表截取的个数
8、替换字符串
var newstr=str.replace("固定关键字/RexExp","新内容")
9、去掉开头和结尾的空白字符
str.trim();
str.trimstart();
str.trimend();
10、切割/分割字符串:
作用:将字符串切割为数组:str<=>arr;
var arr=str.split("自定义切割符")
特殊:1、切割后,切割符就不存在了 2、如果你的切割符写的是一个空字符串"",切散每一个字符。
Math对象
强调:math不需要创建;
属性:主要使用Math.PI
取整
1、上取整:超过一点点就会取下一个整数
Math.ceil(num):不能超过十五位小数
2、下取整:无论超过多少都会舍弃小数点部分
Math.floor(num)
3、四舍五入取整:
Math.round()//只看第一位小数
praseInt+num.tofixed(d)
优点:1.d代表取几个小数位数,
2、解决了浏览器的舍入误差(2-1.6==0.39999999)
缺点:返回的是一个字符串搭配上Parsefloor使用
乘方和开放
乘方:Math.pow(底数,幂)===底数**幂;
开方:Math.sqrt(num)只能开平方用的较少
最大/最小:
var max/min=Math.max/min(a,b,c)
不支持数组,若是想要是用数组元素
Math.max/min.apply(Math,arr);
随机数
Math.random():取0-1之间的随机数,如果搭配上parseInt的话,只能取到最小数,取不到1;
parseInt(Math.random()*(max-min+1)+min)
Date对象
1、创建:
创建当前时间:var now=new Date();
创建自定义时间:var xxx=new Date("yyyy/mm/dd hh:mm:ss")
var xxx=new Date(yyyy,mm,dd,hh,mm,ss)
复制一个日期:所有的API都是直接修改原日期的,无法修改之前的日期,所以在操作API之前,要先复制一个,操作复制之后的日期;
var end=new Date(start)
操作:两个日期可以相减得到一个毫秒差;
API:
年月日星期:Fullyear Month Date Day
时分秒毫秒:Hours Minutes Seconds MiiliSeconds
每一个分类都有一对:getxxx/setxxx
其中getxxx是获取到一个分量的值;setxxx是设置一个分量的值,day没有set操作
特殊:Fullyear:当前的年份
month:0-11;
Date:1-31
Day:0-6
时间:0-59;
对分量进行加减:date.setxxx(date.getxxx()+/-n)
定时器
1、周期性定时器:
var timer=setInterval(回调函数,间隔毫秒)
clearInterval(timer)
2、一次性定时器:
var timer=setTimeout(回调函数,间隔毫秒)
clearTimeout(timer)
两个定时器都是先等再做,可以相互转换,属于异步技术
数据渲染:
1、创建空标签
var elem=doucument.creatElement("标签名")
2、设置必要的属性和事件
elem.属性名="属性值"
elem.on事件名=function(){}
3、上树(dom树):
父元素.appendChild(elem)
Window对象
1、代替global,保存着全局变量和全局函数
2、指代当前窗口本身: 属性:1、获取浏览器的完整大小:outWidth/outHeight
2、获取浏览器文档显示区域的大小:innerWidth/innerHeight
3、获取屏幕的大小:screen.width/screen.height
方法:
打开链接的方式:
1、打开当前窗口可以后退:(_self)
2、打开当前窗口静止后退:Html不行
history:当前窗口的历史记录(打开过的url),可以前进和后退
Location:当前窗口正在打开的url:location.replace("url")//替换,不会打开新页面
3、打开多个:(_blank)
js:open("url","_blank")
4、只能打开一个:
js:open("url","自定义name")
a标签:锚点、跳转、下载
<a href="xx.exe"></a>
打开:
<a href="javascript代码"></a>
打开新的窗口:
var newW=open("url","target","width=?,height=?,left=?,top=?")
关闭:window/newW.close
大小:newW.resize(宽,高)
位置:newW.moveTo(x,y)
window的三个弹出框:具有兼容性问题
警告框:alert("警告文字")
输入框:var user=prompt("提示文字")
确认框:var bool=confirm("提示文字")
定时器也是window的
window的专属事件:
1、window.onload:等所有代码加载完毕之后才会执行
2、window.onresize:窗口大小发生变化就会触发,搭配innerwidth可以根据窗口大小做不同的操作
3、window.onscroll:滚动事件,一旦滚动就会触发:
1、获取当前滚动条的位置:window.scrollY
2、获取元素距离页面顶部有多远:elem.offsetTop/offsetleft
本地/客户端存储技术:
cookie:基本淘汰了
webstorage:永久保存
1、sessionStorage:会话级,浏览器关闭则数据消失
2、localStorage:本地级,只要不清空就永久存在;
操作:
1、添加:xxxStorage.属性名="属性值"
2、读取:xxx.Storage.属性名
3、删除:xxx.Storage.removeItem("属性名")
4、清空:xxx.Storage.clear();