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数组存在的,不止能遍历数组还可以遍历索引数组 建议:索引数组用for,hash数组用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;}基础值) 以上6个API都是在简化我们的for循环 -
箭头函数:简化一切匿名回调函数
固定公式:function去掉,()和{}之间添加=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}也可以省略,如果函数体只有一句话并且是return,那么return的{}都可以省略 -
String概念: 字符串:多个字符组成的【只读】字符【数组】 -
和数组的相同点: 1.字符串的个数:str.length 2.获取字符串中某个字符:str[i]; 3.遍历字符串 4.所有数组不修改原数组的API,字符串也可以截取 -
和数组不同的地方 所有的数组的直接修改原数组的API,字符串都不可用,比如排序只有数组可以使用,但是,字符串也会很多很多属于自己的API -
引用/对象类型:11个 1.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带来的新特性,永久保存 非常简单 分类:2种 1.sessionStorage---会话级,只要浏览器一旦关闭,数据就会死亡 2.localStorage---本地级,只要你不清空,就会永久存在 两者用法一模一样,不用创建,直接可用 操作: 1.添加:xxxStorage.属性名=“属性值”; 2.读取:xxxStorage.属性名; 3.删除:xxxStorage.removeItem("属性名"); 4.清空:xxxStorage.clear();