第二周JS得核心

113 阅读6分钟

第一天

一、数组的基础:
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();