第二周学习内容

170 阅读11分钟

day06

  • 关于数组

    数组基础
    创建数组:
    1.直接量 var arr=[值1,...];
    2.构建函数: var arr=new Array(值,...);
    第二个方法有个坑 new Array(num);//这句话是创建了一个长度为num的空数组,长度是0的empty,里面只有无数的undefined
    
  •   面试题 --按值传递
      原始型:两者互补影响
      饮用型:(函数,数组都是引用类型)会互相影响,这个是保存了一个地址值
      
    
  •     hash数组(关联数组):下标是可以自己定义的
        为什么:索引数组的下标不具有意义,不便于查找
        如何使用:
        1.创建:2步
          1.创建空数组:var arr:[];
          2.为数组添加自定义下标并且赋值:arr["自定义下标"]=新值;
        
        2.访问元素:arr["自定义下标"];
        3.强调:hash数组的length失效了,为0!!
         遍历hash数组:不能再用for循环,必须使用**for in**循环,for in循环是纯自动化的;专门为遍历hash数组存在的,不止能遍历数组还可以遍历索引数组
         建议:索引数组用forhash数组用for in
         
    
  •   数组的API
      1.arr转str:(将数组转字符串)
      var str=arr.join("自定义连接符")
      
      固定套路  两个
      1.笔试题:将数组里面的内容拼接成为一句话/单词---无缝拼接,其实就是拼接成一个空的字符串
      var arr=["h","e","l","l","o",];
      var str=arr.join("");
      console.log(str);
      2.将数组拼接成为DOM页面的元素----数据渲染页面
    
  • 数据拼接:添加元素的新方式

     将你传入的实参全部拼接到arr的末尾
     var newArr=arr.concat(新值1,...);
     特殊:
     1.不修改原数组,只会返回一个新数组
     2.concat支持传入数组参数,悄悄的将你传入的数组打散单个元素再拼接
    
  • 截取子数组

    根据你传入的开始下标截取到结束下标
    var subArr=arr.slice(starti,endi+1);
    特殊:
    1.不修改原数组,只会返回一个新数组
    2.含头不含尾
    3.endi可以省略不写,如果省略,会从starti位置一直截取末尾
    4.starti也可以省略,如果两个实参都省略,那么会从头到位完整复制一份;此操作也叫作深拷贝---复制了一个副本给对方
    5.支持负数参数,-1代表倒数第一个
    6.以上的API都是不修改原数组的
    
  •   删插替
      删除:var dels=arr.splice(starti,n);//n代表的是删除的个数
      
      特殊:虽然他直接修改原数组,但是也有返回值,返回的是删除的数据组成的一个新数组,因为前辈们考虑到有可能删除的东西是需要的东西,哪怕没有删除也会返回一个空数组
      
      插入:arr.aplice(starti,0,新值...);
      
      特殊:
      1.原starti的位置的元素以及后续元素都会向后移动
      2.尽量不要插入一个数组,会导致我们的数组一些是一堆,一些是二维遍历数组的时候就非常不方便
      
      替换:var dels=arr.splice(starti,n,新值...);
      
      特殊:删除的个数和替代的个数不必相同
      
    

    翻转数组(不是重点): arr.reverse();

       数组排序
       1.冒泡排序
       2.实际开发中:arr.sort();
       默认:讲数组中的元素转为字符串后,再按位pk每个字符的Unicode码
       
       升序排列:
       arr.sort(function(a,b)){}=>这个函数也叫作匿名回调函数
       1.arr.sort(function(a,b)){
       return a-b}升序
       2.arr.sort(function(a,b)){
       return b-a}降序
       
       1.在网页上有功能能带有排序,他的底层一定是数组,因为js中只有数组可以排序
       2.以后只要网页上有随机功能,底层一定是用到了随机数组
       
       
    

day07

一.数组的API
1.栈和队列:添加元素和删除元素的新方式:


栈:其实就是数组,只不过一段封闭了,只能从另一端进出
何时使用:现实生活中,情况不多:电梯,旅游巴士...

如何使用:
开头进:arr.unshift(新值,...);//添加元素的新方式,向前添加
缺点:导致其余元素的下标发生变化

开头出:var first=arr.shift();//删除元素的新方式,向前删除,一次只能删除一个
缺点:导致其余元素的下标都会发生变化

结尾进:arr.push(新值,...)//添加元素的新方式,向后添加
结尾出:var last=arr.pop();//删除元素的新方法,向后删除


队列:其实就是数组,只不过是一端进,从另一端出;

开头进:arr.unshift(新值,...);
结尾出:var last=arr.pop();


结尾进:arr.push(新值,...);
开头出:var first=arr.shift();
  • 二维数组:数组的元素,又引用着另一个数组

    何时:在一个数组中,希望再次细分每个分类
    
    创建: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])}
    };
    
  • 6个数组API

    1.判断:2个
    
    every:每一个,要求所有的元素都满足条件才会为true,只要有一个不满足则为false,类似于&&
    
    some:有一些,要求只要有一个元素满足,那么久会为true,所有元素都不满足则为false,非常类似于||
    
    2.遍历:拿到的数组中的每一个元素做相同 或 类似的操作
    
    forEach---直接修改原数组
    
    map----不修改原数组,返回一个新数组
    
    3.过滤和汇总:
    
    过滤:筛选出需要的部分,但是和现实不一样的是原数组并不会发生变化
    var subArr=arr.filter((val,i,arr)){
    return 判断条件;}
    
    汇总:var result=arr.reduce(function(prev前一个,val当前值,i当前值下标,arr数组)
    {return prev+val;}基础值)
    
    以上6API都是在简化我们的for循环
    
  • 箭头函数:简化一切匿名回调函数

    固定公式:function去掉,()和{}之间添加=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}也可以省略,如果函数体只有一句话并且是return,那么return的{}都可以省略
    
  •    String概念:
    字符串:多个字符组成的【只读】字符【数组】
    
  •   和数组的相同点:
      1.字符串的个数:str.length
      2.获取字符串中某个字符:str[i];
      3.遍历字符串
      4.所有数组不修改原数组的API,字符串也可以截取
      
    
  •  和数组不同的地方
     所有的数组的直接修改原数组的API,字符串都不可用,比如排序只有数组可以使用,但是,字符串也会很多很多属于自己的API
     
    
  •    引用/对象类型:111.string number boolean---包装类型
     2.array  function  date day math  regexp  error  object  global   
     
    
  • 包装类型:专门用于将原始类型封装成一个引用类型的对象

      为什么:原始类型的值原本是没有任何属性和方法,意味着原始类型是不支持去做任何操作的
      
      如何使用:只要你试图使用原始类型的变量调用属性货方法的时候
      
      何时释放:方法调用完毕后,自动释放包装类型,又变成原始类型
      
      
    

day08

  • 字符串API:就是一些只有字符串才能使用的函数,不需要我们创建

    转义字符:
    1."\"   将字符串中的程序冲突的字符转为原文
    2."\n"  换行
    3."\t"  大空格制表符
    4.输入Unicode编码的字符
    
    大小写转换:将字符串中的每一个字符
    
    转大写:var upper=str.toUpperCase();
    转小写:var upper=str.toLowerCase();
    
    获取字符串中指定的字符:str.CharAt(i)==str[i];
    
    获取字符串中指定位置的字符的ASCII码
    
    var ascii=str.CharCodeAt(i);
    
    通过ASCII码转回原文:
    
    var 原文=String.fromCharCode(ascii);
    
  •   检索字符串:检查索引,检查下标:获取关键字的下标
    
       var i=str/arr.indexOf("关键字",starti);
       
       从starti位置开始,查找右侧第一个关键字的第一个字符的位置
       
       starti可以省略,默认从0的位置开始找
       
       返回值:找到了,返回第一个关键字的第一个字符的下标位置
       
             没找到,返回-1,其实我们根本不关心下标为多少,我们只关心下标为不为-1
       作用:判断有没有
       
       强调:数组也能使用此方法,数组这个方法是后期添加上的,原本此方法只有字符串可以用
       
       
       拼接字符串:var newStr=str.concat("新字符串",...);  [还不如+运算]
       
    
  •    截取字符串;3个       
       1.var subStr=str/arr.slice(starti,endi+1);这个比较好
       3.str.subString(starti,endi+1);不支持负数
       4.str.substr(starti,n);//n代表的是截取的个数
    
  •    替换字符串:
     
       var newStr=str.replace("固定关键字"/正则表达式,“新内容”);
       
    
  •   切割/分割/分割字符串:
    
      作用:将字符串转为数组:
      var arr=str.split("自定义切割符");
      
      注意:
      1.切割后,切割符就不存在了
      2.如果你的切割符写的是“”,会切散每一个字符
      
    
  • 去掉空白字符: var newStr=str.trim去全部/ trim Start去开头 / trim End()

  • js如何建立新元素:3步
    
    1.创建空标签:var elem=document.CreateElement("标签名");
    2.为其设置必要的属性和事件:
          elem.属性名="属性值";
          elem.on事件名=function(){操作}
    3.挂载上树/渲染页面:父元素.appendChild(elem);
    

day09

  • 1.Math对象:专门提供了数学计算的API

    强调:不需要创建,可以直接使用
    
    API
    1.取整:3种
      上取整:超过一点点,就取下一个整数
     
       var num=Math.ceil(num);//小数位不超过15位,否则只能取整不能上取整
      
     下取整:无论超过多少都会省略小数部分
       
       var num=Math.floor(num);
       
     四舍五入取整
       
       var num=Math.round(num);//只取小数点第一位
       
    2.num.toFixed(d)
     
     n代表的是取多少位小数
     
     优点:1.可以四舍五入,并且可以保留到指定的小数位数
          2.解决浏览器带来的舍入误差
     缺点:结果是一个字符串,建议搭配上parseFloat()使用
     
    
  •    乘方和开方:
    
      乘方:Math.pow(底数,幂)----更简化:底数**幂
      
      开方:Math.sqrt(num)-----只能开平方
      
    
  •    最大值和最小值
       
       var max/min=Math.max/ min(a,b,c,d...);自动在你传入的数字中比较出最大值和最小值
       
       问题:本身是不支持数组的运算的
       
       解决:固定用法:Max.max/ min.apply(Math,arr);
       
       apply具有数组打散的功能
       
       绝对值:把负数变为正数
       
       Math.abs(-1);
       
    
  •    随机数:Math.random();在0-1之间去随机的小数
    
       搭配上parseInt,只能取到0,但不能取到1,意味着取不到最大值
       
       公式:parseInt(Math,random()*(max-min)+min)
       
    
  •   Date对象
      创建:4种
       
       1.创建一个当前日期:
       var now=new Date();
       
       2.创建自定义时间:
       var elem=new Date("yyyy/MM/dd/ hh:mm:ss");
       
       3.创建一个自定义时间:
       var elem=newDate(yyyy,MM-1,dd,hh,mm,ss);  //这里月份要-1
       
       4.复制一个日期:
       
       为什么:日期的所有API都是直接修改原日期的,无法获得修改之前的日期,所以在执行API之前先进行复制,然后再操作复制后的日期
       
       var end=new Date(start);
       
    
  •    API
       分量:时间的单位
       
       年月日星期:FullYear   Month  Date  Day
       时分秒毫秒:Hours  Minutes  Seconds  Milliseconds
       
       每个分量都有一对获取和设置的办法
       get xxx/ set xxx
       
       特殊:
       Month---0-11
       Date---1-31
       Day----0-6  0代表的是星期天
       Hours---0-23
       Minutes,Seconds:0-59
       
       2.Day,没有set的方法
       3.如果希望对某个分量进行加减操作:
        date.setxxx(getxxx)+/-n;
       4.格式化日期为本地字符:
        date.toLocaleString();垃圾
        
    
  •    定时器
       1.周期性定时器:每过一段时间会执行一次,先等再做
       
       开启:timer=setInterval(回调函数,间隔秒数)
       
       停止:clearInterval(timer);
       
       2.一次性定时器:等待一段时间,只会做一次就结束了
    
       开启:timer=setTimeout(回调函数,间隔毫秒数)
       
       停止:clear Timeout(timer);
       
    
  •    day10
       
     1.BOM----浏览器对象模型
     2.window对象
       1.全局对象:保存着全局变量和全局函数
       2.指代当前窗口本身:
       属性:
       1.获取浏览器的完整大小:outerWidth/outerHeight
       2.获取浏览器的文档显示区域的大小:innerWidth/innerHeight---
       3.获取屏幕的完整大小
       
    
  •    方法:
       1.打开链接的新方式:
         1.当前窗口打开,可以后退:
         HTML:<a herf="url">内容</a>
         js:open("url","_self");
         
       2.当前窗口打开,禁止后退:使用场景:比如电商网站,结账后不许后退
         HTML做不到
         History:当前[窗口的历史记录] 他其实是可以前进后退
         Location:当前[窗口正在打开的URL],有一个API:
         location.replace("新URL");//替换
       3.新窗口打开,可以打开多个
         HTML:<a herf"url" target="_blank">内容</a>
         js: open("url","_blank");
       
       4.新窗口打开,只能打开一个:使用场景:比如电商页面,只允许用户打开后,例如结账页面
       HTML:<a herf="url" target="自定义一个name">内容</a>
      
    
  •   a标签的其他用途
     
      1.跳转
      2.锚点
      3.下载按钮:<a herf="xxx.exe/rar/zip">下载</a>
      4.打开图片和txt文档<a herf="xx.png/jpg/txt">打开图片和txt</a>
      5.直接书写js---不需要绑定事件<a herf="javascript:js代码">xxxx</a>
     
    
  •    2.打开新窗口/新链接:newW=open("url","target","width=?,"height=?,left=?top=?");
           特殊:1.如果没有加第三个参数,那么窗口会和浏览器融为一体
                 2.如果加了第三个参数,那么则会脱离浏览器独立存在
      
      3.关闭窗口window/newW.close()
      4.改变新窗口大小:newW.resizeTo(新宽,新高);
      5.改变新窗口位置:newW.moveTo(新宽,新高);
      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事件---滚动事件,一旦滚动就会触发
        
        
      9.本地客户端存储技术:
        cookie:淘汰了,存储的大小只有2kb,而且操作极其麻烦,切割只能保存3天
        webStorage:H5带来的新特性,永久保存 非常简单
       
       分类:21.sessionStorage---会话级,只要浏览器一旦关闭,数据就会死亡
       2.localStorage---本地级,只要你不清空,就会永久存在
       
       两者用法一模一样,不用创建,直接可用
       
       操作:
       1.添加:xxxStorage.属性名=“属性值”;
       2.读取:xxxStorage.属性名;
       3.删除:xxxStorage.removeItem("属性名");
       4.清空:xxxStorage.clear();