js学习第二周

76 阅读8分钟

day04:

自定义函数:
        一、创建
            1.声明方式 创建函数
                function 函数名(形参1,形参2,..){
                            函数体;
                            return 返回值;
                }
            2.直接量方式 创建函数
                var fn=function(形参1,形参2,..){
                       函数体;
                       return 返回值;
                }
             注意:函数名不要重复,否则函数会被覆盖成最后一个同名的函数。
             return:
                 ①本意是退出函数,但如果return后跟了一个值则表示返回该值。
                 ②return只负责返回值不负责保存值,所以放我们调用的函数有返回值时,需要去创建一个变量去保存返回的。
                 ③return后不跟值时实际上也会有一个返回值,默认为undefined,而undefined对于我们来说是无用的,所以在写代码的时候,如果return没写返回值时我们就不创建变量去保存函数返回的undefined。
                 ④如果在全局变量需要使用到局部变量,则需要return去返回函数里创建的局部变量。
       二、调用
           函数名(实参1,实参2,..);
       三、作用域
           1.全局作用域:全局变量、全局函数,在任意一个地方都可以使用。
           2.局部作用域:局部变量、局部函数,只能在函数调用时,函数内部使用。
           变量的使用规则:有先使用局部变量,局部没有则使用全局变量,全局变量再没有直接报错。
           特殊点(是缺点):
                   ①局部可以使用全局的,但是全局不能使用局部的(可以解决,使用return来返回局部的)
                   ②不能再局部里面对为声明的变量进行赋值,会造成全局污染,降低网页性能
                         比如:在局部里a=1;此时a不仅仅在局部能使用,在全局也能使用。
      四、声明提前(实际开发基本不用,一般出现在面试题里)
          原理:在程序正式执行之前会将var声明的变量(轻)和function声明的函数(重)提前到当前作用域的顶部,但是赋值留在原地
          强调:
              声明方式创建的函数会整个提前,直接量方式声明的函数只会将var 函数名 部分提前。
      五、重载
          同一作用域内的几个函数名字相同但形参列表不同。
          目的:减轻程序员书写代码的压力
          方法:在函数的内部自带一个arguments对象(类数组对象:就是格式与数组结构类似,拥有length属性,并且可以通过索引来访问或设置里面的元素,但是不能使用数组的方法),其作用就是没有任何形参,但是能接住所有的实参。
          固定套路:
              通过固定下标去获取传入的某一个实参;
              通过length去获取到数组的长度。

Attay 数组的基础
      创建一个变量保存多个数据。
      数组都是线性排列的,出了第一个元素以外的所有元素都有唯一的前驱元素,出了最后一个元素以外都有唯一的后继元素。
      每一个元素都一个自己的位置,称之为下标,下标是从0开始到最大长度-1(.length-1)。
      
      创建数组:2种
          直接量方式 var arr=[];//空数组
                    var arr=[数据1,数据2,数据3,...]
          构造函数方式 var arr=new Array();//空数组
                      var arr=new Array(数据1,数据2,数据3,...)
          获取数组中的元素
              数组名[index] index为元素下标
          后续添加/替换元素
              数组名[index]=新数据;
              下标签没有数据则为添加,下标处有数据则为替换
          数组具有三大不限制
              不限制元素的类型
              不限制元素的长度
              不限制下标越界
                  如果获取元素时,下标越界则返回undefined
                  如果添加元素时,下标越界,会得到一个稀疏数组
         三个固定套路
             在数据末尾添加元素 arr[arr.length]=新数据;
             获取数组的倒数第n位元素 arr[arr.length-n]
             缩容(将数组的长度变小)删除倒数第n个元素 arr.length -= n;
         遍历数组
             for(var i = 0;i<arr.length;i++){}               

day05

DOM Document Object Model 文档对象模型,提供了一些方法用于操作HTML文档
DOM树
    概念:DOM将html看做一个倒挂的树状结构,树根为document
    document对象:不需要程序员创建,由浏览器的js解释器自动创建,一个页面只有一个document树根
    作用:可以通过树根对象找到我们想要的任何一个DOM元素/节点/对象
查找元素:两大方面
    1.直接通过HTML的特点去查找属性
        ①通过ID去查找元素
            var elem = document.getElementById("id值");
            特殊:
                找到了就返回当前找到的DOM元素,没找到就返回一个null
                如果出现了多个相同id,只会找第一个
                一个DOM元素 -> <elem 属性="属性值">内容</elem>
                id不用查找,直接就可以使用
       ②通过标签名去查找元素
            var elem = document.getElementsByTagName("标签名");
            特殊:
                找到了返回一个类数组DOM集合,没找到返回一个空集合
                js只能直接操作DOM元素,不能直接操作DOM集合,要么通过下标拿到某一个,要么通过遍历拿到每一个
                通过document会找到所有的该元素,如果想要某一个元素下的该元素,则可以先找到该元素的父元素,通过父元素再找到该元素
      ③通过class名去查找元素
           var elem = document.getElementsByClassName("class名");
           特殊:
                找到了返回一个类数组DOM集合,没找到返回一个空集合
                js只能直接操作DOM元素,不能直接操作DOM集合,要么通过下标拿到某一个,要么通过遍历拿到每一个
                通过document会找到所有的该元素,如果想要某一个元素下的该元素,则可以先找到该元素的父元素,通过父元素再找到该元素
   2.通过元素之间的关系去查找元素
       1.父元素 elem.parentNode;
       2.子元素 elem.childrem;
       3.第一个子元素 elem.firstElementChild;
       4.最后一个子元素 elem.lastElementChild;
       5.前一个兄弟元素 elem.previousElementSibling;
       6.后一个兄弟元素 elem.nextElementSibling;
操作元素 先找到元素,才能操作元素
    1. 内容 
        elem.innerHtml 获取/设置开始标签到结束标签之间的内容,识别标签
           获取:elem.innerHTML
           设置:elem.innerHTML = "新内容"
        elem.innerText 获取/设置开始标签到结束标签之间的纯文本,不识别标签
            获取:elem.innerText
            设置:elem.innerText = "新内容"
    2.属性
        获取属性值 elem.getAttribute("属性名");
        设置属性值 elem.getAttribute("属性名","属性值")
        简化:
            获取: elem.属性名
            设置: elem.属性名="属性值"
            两个缺陷:
                class必须写成className
                不能操作自定义属性
    3.样式
        获取:elem.style.css属性名;
        设置:elem.style.css属性名="属性值";
        特殊:
            css属性有-的地方改为小驼峰命名法
            只能获取到内联样式
一切的获取都是为了做判断,一切的设置是为了修改
绑定事件
    elem.on事件名 = function(){
        操作;
    }
关键字this
    绑定单个事件 --> this表示这个元素
    绑定多个时间 --> this表示当前触发事件的元素

day06

数据的基础
    面试题:按值传递 var a = x; var b = a;问如果改变a b是否会变,改变b a是否会变?
        如果传递的是原始类型则两者互不影响
        如果传递的是引用类型则改变一个另一个会跟着改变
    面试题:如何释放引用类型
        先看引用类型被引用了几次,要释放该引用类型则需要将所以【引用了】【该引用类型】的变量全部释放
hash数组
    索引数组的下标无具体意思,不便于查找
    如何使用:
        创建空数组: var arr=[];
        为数字添加下标且赋值 arr["下标名"]="新值"
        访问 arr["自定义下标"]
        强调 hash数组的length失效 永远为0
        利用for in来遍历
            for(var i in hash数组名){
                数组名[i];
            }
数组的API
    1.arr转str
        var str = arr.join("自定义连接符")
        固定套路
            ①arr.join("") 无缝连接为一句话
            ②将数组拼接为DOM页面元素(数据渲染页面)
                selects[1].innerHTML ="<option>"+capital[index].join("</option><option>")+"</option>"
    2.拼接数组
        var 数组 = arr.concat(新值...)
        特殊
            1.不修改原来的数组,会返回一个新的数组
            2.concat支持传入数组
    3.截取子数组
        var 数组 = arr.slice(i,p)  i表示开始下标 p表示结束下标
        特殊:
            不修改原来的数组,返回一个新数组
            含头不含尾
            p可以不写,表示从开始下标到结尾
            开始下标和结束下标都可以不写,此操作成为深拷贝
            也支持负数,-1表示倒数第一个
    4.删插替
        var del = arr.splice(i,n)  i表示开始下标 n表示几个
        特殊:直接修改数据,有返回值,返回的是被删的数据组成的新数组
        
        var del =arr.splice(i,0,新数据) i表示开始下标
        特殊:原来开始下标的位置的元素以及后续元素都会向后移动
              尽量不要插入数组
        
        var del = arr.splice(i,n,新数据) i开始下标 n删除个数
        特殊 删除的个数和插入的个数可以不同
   5.翻转数组
        arr.reverse();
   select专属事件 onchange 选中项发生改变的时候
   select专属属性 selectedIndex 获取选中项的下标
            

day07

  6.数组排序
      arr.sort();默认将数组里的元素转为字符串后,按位进行比较每个字符的Unicode号
      解决:
          升序
          arr.sort(function(a,b){
              return a-b;
          });
          a-b>0 前一个数大于后一个数;a-b<0 前一个数小于后一个数;a-b==0 前一个数等于后一个数;
          降序
          arr.sort(function(a,b){
              return b-a;
          });
          强调:网页有排序功能,说明底层一定是一个数组,因为js之中只有数组可以排序
              生成随机数 Math.random(max-min+1)+min 带有小数的随机数
     栈和队列:添加元素和删除元素的新方式
         栈:其实就是数组,只不过一端封闭了,只能从一端进出
             开头进:arr.unshift(新值,..)向前添加 缺点:导致其他元素下标发生改变
             开头出:arr.shift()向前删除,一次删除一个,有返回值,返回被删除的元素,缺点:导致其他元素下标发生改变
             结尾进:arr.push(新值,..)向后添加
             结尾出:arr.pop()向后删除,一次删除一个,有返回值,返回被删除的数据
        队列:其实也是数组,一端进,另一端出
             开头进:arr.unshift(新值,..)向前添加 缺点:导致其他元素下标发生改变
             结尾出:arr.pop()向后删除,一次删除一个,有返回值,返回被删除的数据
             
             结尾进:arr.push(新值,..)向后添加
             开头出:arr.shift()向前删除,一次删除一个,有返回值,返回被删除的元素,缺点:导致其他元素下标发生改变
             
鼠标移入:elem.onmouseover=function(){}
鼠标移出:elem.onmouseout=function(){}
周期性定时器:
    开始 timer = setInterval(function(){操作;},间隔毫秒)
    停止 clearInterval(timer);
    
ES5提供的3组(6个)新的API
    1.判断 2个 结果为一个布尔值
        every:每一个,要求所有的元素都满足条件才为true,主要有一个不满足则为false,类似于&&
            var bool = arr.every(funciton(val,i,arr){
                //val 当前的值
                //i 当前值的下标
                //arr 数组本身
                return 判断条件;
            })
       some:有一些,要求只要有一个元素满足条件就为true,全部不满足条件才为false,类似于||
           var bool = arr.some(funciton(val,i,arr){
                //val 当前的值
                //i 当前值的下标
                //arr 数组本身
                return 判断条件;
            })
    2.遍历,拿到数组中的每一个元素做相同或相似操作
        forEach---直接修改原数组
            arr.forEach(function(val,i,arr){
                操作;
            })
        
        map---不会修改原数组,返回一个新数组
            var newArr = arr.map(function(val,i,arr){
                操作;
            })
   3.过滤和汇总
       过滤:筛选出需要的部分,不会修改原数组
           var newArr = arr.filter(function(val,i,arr){
               return 判断条件;
           })
       汇总:
           var result = arr.reduce(function(prev.val,i,arr){
               //prev 当前数据的前一个数据
               return prev+val;
           })
ES6箭头函数,专门简化一切匿名回调函数
    简写公示 function去掉,()和{}之间添加=>如果形参只有一个name()省略,如果函数体只有一句话,那么{}省略,如果函数体只有一句话且是return,那么{}和return都省略;

二维数组:数组的元素,又引用着另一个数组
    何时使用:在一个数组,希望再次细分每一个数组
    创建:
        var arr=[
            [],
            [],
            []
        ];
    访问:数组名[行下标][列下标]
    特殊:面试题
        列下标越界,返回undefined
        行下标越界,得到一个把报错,因为行下标越界后得到一个undefinedundefined没有资格加[]做操作
        遍历二维数组,必然两层循环
            for(var r=0;r<arr.length;r++){
                for(var c=0;c<arr[i].length;c++){
                    arr[r][c];
                }
            }                   
             

day 08

String的概念
    什么是字符串:多个字符组成的【只读】字符【数组】
    和数组的相同点
        1.字符串中的个数 str.length
        2.获取某个字符 str[i]
        3.遍历
        4.所有不修改原数组的数组API,字符串也有使用(concat,slice)
    不同点
        所有直接修改原数组的数组API,字符串都不可以使用
        字符串也有很多自己的API
1.转移字符:\
    作用:
        ①将字符串和程序冲突的转为原文
            " \"把双引号转为""\" "  不转程序会报错
        ②包含特殊功能的符号
            换行:\n
            制表符:\
        ③输出Unicode编码的字符 \u
            汉字的第一个字    \u4e00  ascii码 19968
            汉字的最后一个字  \u9fa5  ascii码 40869
2.***大小写转换
    when:程序不区分大小写,就要【先统一】的转为大写小写,再比较
    how:  var 大写 = str.toUpperCase();
          var 小写 = str.toLowerCase();
3.获取字符串中指定位置的字符
    str.charAt(i) === str[i]
4.***获取字符串中指定位置字符的ASCII码
    var acsii = str.charCodeAt(i);
    通过ascii码传回原文
    var str = String.fromCharCode(ascii码)
5.***检索字符串 获取关键字的下标
    var i= str.indenxOf("关键字",starti)
    从starti位置开始,查找右侧第一个关键字的第一个字符的位置
    starti可以不写,表示从开始位置开始查找
    返回值:
        找到了则返回关键字的第一个字符的下标,没找到则返回 -1
    作用:判断在字符串中有没有关键字
    数组也有该方法,但是老IE(ie8以下)没有该方法
    
    面试题:获取某个字符串中所有关键字的下标
        var str = "no zuo no die why you try"
        var index = -1;
        while((index = str.indexOf("no",index+1))!=-1){
            console.log(index);
        }
6.拼接字符串
    var newArr = str.concat(新字符串,..)   不如+运算
7.***截取字符串
    var subStr = str/arr.slice(starti,endi);
               = str.substring(starti,endi);//不支持负数
               = str.substr(starti,n);  //n代表截取的个数
8.替换字符串
    var newstr = str.replace("关键字","新内容");
9.切割/分割/分隔字符串
    作用:将字符串切割为数组 str <=> arr
    var arr = str.split("自定义切割符");
    特殊:
        切割后,切割符就不在了
        如果你的切割符为"",切割每一个字符
10.去掉空白字符
    str.trim()/str.trimStart/str.trimEnd()