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()