第二周笔记

112 阅读7分钟

day01

按值传递

如果传递的是原始类型:是复制一个副本给对方,两者互不影响
如果是应用类型就相当于把地址值给对方,一个变化另一个也会变。应用类型比较是地址值比较
释放引用类型要看清楚有几个变量每个变量都需要释放
建议:代码封装函数内,函数会自动释放变量

hash数组

创建:

var arr=[];
arr["自定义下标”}=新值

访问:

arr["自定义下标"]

强调:

hash数组的length会失效,永久为0
遍历使用for in
for in也可以遍历索引数组

数组的API

arr.join

1,字符串的无缝拼接:
var str=arr.join("自定义连接符"]
2.数据渲染:
var arr=["北京","南京","东京"]
var str="<option>"+arr.join("</option><option>")+"</option>"
sel1.innerHTML=str

拼接数组

var newArr=arr.concat(新值1,arr1,...)
特殊:不修改原数组
可以传入数组,但会变为元素再拼接

截取子数组、

var 
subArr=arr.slice(starti,endi)
不修改原数组
含头不含尾
endi可以不写,则截取到末尾
starti和endi不写则会复制一遍原数组——————深拷贝
支持负参数

删插替:

删除:var dels=arr.splice(starti,n)//从哪里删除,删几个
插入:var dels=arr.splice(starti,0,新值1,。。。)
替换:var dels=arr.splice(starti,n,新值1,。。。。)
替换可以删除的数量不等替换的数量

翻转数组:

arr.reverse();

day02

冒泡排序

for(var j=1;j<arr.length;j++){ for(var i=0;i<arr.length-j;i++){ if(arr[i]>arr[i+1]){ var m=arr[i+1] arr[i+1]=arr[i] arr[i]=m } } }

arr.sort

默认会把数组中的元素转化为字符串然后按位pk
数组中的数字升序排序:arr.sort(function(a,b){return a-b})
数组中的数字降序排序:arr.sort(function(a,b){return b-a})

强调:如果页面中有排序功能那么他的底层一定是一个数组,因为js中只有数组有排序功能 如果页面中有随机功能,那么他的底层一定有随机数公式

栈和队列

栈:一端进出另一端封闭 队列:一端进另一端出

unshift shift push pop

开头进:arr.unshift(新值1,...)://向前添加元素,缺点:会改变其他元素的下标
开头出:var first=arr.shift()://向前删除一个元素,返回值是被删除的数,缺点;会改变其他元素的下标
结尾进:arr.push(新值1,...)://向后添加元素
结尾出:var last=arr.pop();//向后删除一个元素

扩展:

周期定时器:开启:timer=setInterval(function){操作},间隔毫秒数)
停止:clearInterval(timer)
鼠标移入:elem.onmouseover
鼠标移出:elem.onmouseout

ES5(2014年)为数组提供的6个API

判断、

every:数组的每个元素都满足才为true,类似&&
var bool=arr.every(function(val,i,arr){
    //val-当前的值
    //i--当前值的下标
    //arr--数组本身
    return 判断条件;
})

some:有一个元素满足就为true,类似||
var bool=arr.some(function(val,i,arr){
   return 判断条件
})

遍历

    forEach--直接修改原数组
        var bool=arr.some(function(val,i,arr){
        操作
        })
    
    map--不修改数组-返回一个新数组
    
        var newarr=arr.map(function(val,i,arr){
            return 操作;
        })

过滤,汇总

 过滤:选出你要的部分但是原数组不会变
 var subarr=arr.filter(function(val,i,arr){
     return 判断条件
 })
 
 汇总:
     var sum=arr.reduce(function(prev,val,i,arr){
         return prev+val
     })

箭头函数

  公式:function去掉,()和{}之间添加一个=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}省略,如果函数体只有一句话并且是return,那么return一起省略

二维数组

  :在一个数组中再细分每个数组
  创建:var arr=[[],[],[]]
  访问:arr[行下标][列下标]
  面试题:
  行下标越界,返回undefined
  列下标越界,会报错---行下标越界其实已经得到了undefined了,undefined没有资格加{}做操作
  遍历二维数组,必然两层循环,外层控制行,内层循环控制列

string的概念

 :多个字符组成的只读字符数组
 和数组的相同点:str.length   str[i]  遍历   str.concat  str.slice
 所有数组可以修改原数组的api,字符串都不能用

引用类型

 string number boolean-->具有包装类型
 array function date math regexp
 error object 
 global-全局对象,被window替代

包装类型

 :专门把原始类型的值封装成一个引用类型的对象的
 因为原始类型原本没有属性和方法但是经常会操作这三个
 所以前辈们就给这三个提供了包装类型,变成了对象
 何时使用:试图用原始类型的值去调用任何属性和方法时就会自动包装
 何时释放:方法用完后自动释放包装类型,变回原始类型的值

day03

string

 字符串:多个字符组成的只读字符数组
 与数组的相同点:str.lenght   str[i]  遍历字符串  可以使用数组不修改原数组的api
## string的api
    1,转义字符:\
    作用:
        1,把字符串中和程序冲突的字符转为原文
        2,特殊功能:换行:\n 空格:\t=>等效空格
        3,输出unicode字符:\u4e00
    2,大小写转换:
        var 大写=str。toUpperCase()
        var 小写=str。toLowerCase()
    3,获取字符串中的指定位置:
         str.charAt(i)===str[i]
    4,获取字符串中的指定位置的ASCLL码:
         var ascil=str.charCodeAt(i)
         转为原文
         var 原文=String.fromCharCode(ascil)
    5,检索字符串:检索获取关键字下标
        var i=str/arr.indexOf("关键字",starti)
        返回值:找到就返回关键字的下标,没找到就返回-1
    6,拼接  字符串:
        var newStr=str.concat(新字符,。。。)://不如加运算
    7,截取字符串:
        var newstr=str/arrslice(starti,endi+1)
        str.substring(start,end+1)
        str.substr(starti,n)://n是截取个数、
    8,替换字符串:
        var newstr=str.replace
    9,去掉开头结尾的空白字符
        str.trim();
        str.trimStart();
        str.trimEnd();
    10,分割字符串
        把字符串分割成数组
        var arr=str.split("分隔符")
        分割后分隔符不存在了
        分隔符为“”时是切散每个字符

day04

math对象

api

   1,取整
       上取整:Math.ceil(num)://小数点后15位会失效
       下取整:Math.floor(num):
       四舍五入取整:Math.round(num);//只看第一位小数
       num.toFixed(d):d是保留小数的位数,自带四舍五入,可以解决浏览器的舍入误差
   2,乘方/开方
        Math.pow(底数,幂·)==:底数**幂
        开方:Math.sqrt(num)://只能开平方
        
   3,最大值最小值
        var max/min=Math.max/min(a,b,c,d,s)
        传入数组:
         Math.max/min.apply(Math,arr)
    4,绝对值:把负数变成正数
        Math.abs(num)
    5随机数;
        parseInt(Math,random()*(max-min+1)+min)
        

Date 对象

  1,创建
      1.当前时间
          var now=new Date()
      2,创建一个自定义时间
          var birth=new Date("yyyy/MM/dd hh:mm:ss")
      3,创建自定义时间
          var birth=new Date("yyyy,MM-1,dd,hh,mm,ss")
      4,复制日期
          var end=new Date(start)
   2,操作;
       1,日期相减得到毫秒数
       2,api
           年月日星期:FullYear Month Date Day
           时分秒毫秒:Hours Minutes Seconds Miiliseconds
           获取getxxx/设置setxxx
           
           Day没有set操作
           
           date.setxxx(date.getXXX()+/-n)
           
            格式化日期:date.tolocaleString()
            
   ## 定时器
       开启:timer=setlnterval(callback,间隔毫秒数)
       停止:clearInterval(timer)
       开启:timer=setTimeout(callback,间隔毫秒数)
       停止:clearTimeout(timer)
       
  ## js创建页面元素
      1,创建空标签
          var elem=document.createElement("标签名")
      2,为其设置属性,事件
          elem.属性名=“属性值”、
          elem.on事件名=function(){}
      3,渲染到dom树上
          父元素.appendChild(elem);
       

day05

dom
    获取浏览器的大小:outerWidth/Height
    获取浏览器文档区大小:innerWidth/height
    获取屏幕完整大小:screen.width/height
    
    打开链接方式:
    open("url","_self")
    location.replace("新url")
    open("url","_blank")
    open("url","自定义名字")
    
    打开新窗口:var neww=open("url","target","width=,height=,left=,top=")
    
    关闭窗口:neww.close()
    改变新窗口大小:neww.resizeTo(新宽,新高)
    改变新窗口位置:neww.moveTo(新x,新y)
    
    确认框:var bool=confirm("文字")、
     、
      事件:window.onresize==媒体查询的底层原理
            window.onscroll-滚动事件
                1,获取滚动条的位置:window.scrollY
                2,获取元素距离页面顶部多远:elem.offsettop/pffsetleft
      本地储存技术
      添加:xxxstorage.属性名="属性值"
      读取:xxxstorage.属性名;
      删除:xxxstorage。removeitem("属性名")
      清空:xxxstorage.clear()