橙色 漏了
红色 错了
Day01
一、数据类型转换
1.1强制转换
-
转字符串
var str=x.toString();//x不能是undefined和null var str=String(x);//万能,完全等于隐式转换,不如+""
-
转数字
Number() parseInt/Float(str)
-
转布尔
Boolean() 6个为false:0 , "" , undefined , null , NaN , false
1.2隐式转换
二、运算符和表达式
2.1算数运算符
+-*/%
2.2比较运算符
< > <= >= == != === !==
结果:布尔值
隐式转换:默认,转为数字再比较大小
-
如果参与比较的左右两边都是字符串,则按位PK每个字符的ascii码
0-9<A-Z<a-z<汉字,常识:汉字的第一个字是“一”:unicode号为4e00,ascii为19968;最后一个字 最后一个字:龥:unicode号:9fa5 - ascii:40869
-
NaN参与任何比较为false
-
undefined==null为true
-
undefined===null为false
全等:数值相同,数据类型相同,不再带有隐式转换
!==不再带有隐式转换的不等比较
2.3逻辑运算符
&&全部满足为真 ||一个满足为真 !取反
短路逻辑:
条件&&(操作);
||短路:实现浏览区兼容问题:二选一
三、位运算
<<左移:m*2的n次方 >>右移:m/2的n次方
四、赋值运算
+= -= *= /= %= ++ --
五、三目运算符
条件?操作1:操作2; 满足条件做操作1,不满足做操作2; 嵌套: 条件1?操作1:条件2?操作2:默认操作;
Day02
一、自定义函数
1.1创建函数并调用
方式一:
var 函数名=function(){ 操作; }
方式二:
function 函数名(){ 操作; }
1.2作用域
-
全局:任何地方都能使用
-
局部:函数内部使用
没写return,最后的return值是undefined
1.3声明提前
程序执行之前,将var声明的变量和function声明的函数,提前到当前作用域的顶部,变量比函数轻,但是赋值留在原地
1.4按值传递
var a=2; b=a; 深拷贝;相当于复制了一份给b,b的改变不会影响a var a=[1,2,3]; b=a; 浅拷贝,两者共用,b的改变会影响a
二、预定义全局函数
前辈们提前写好的,我们程序员可以直接使用的,全局(在任何地方都可以使用)
-
编码和解码: 问题: url中不允许出现多字节字符,如果出现会乱码 utf-8编码格式下,一个汉字,占3字节 解决:发送前,前端将多字节字符编码为单字节字符(数字、字母) 发送后,后端接住,然后将单字节字符解码为原文
使用:
编码:var code=encodeURI("汉字");
解码:var 原文=decodeURI(code);
-
isFinite(num):判断num是不是无穷大 true->有效数字 false->无穷大
为false的:NaN Infinity 分母为0 不能用来判断是不是NaN
-
parseInt/Float、isNaN、eval
三、分支结构
switch(条件/变量){
case 值1:
操作1;
case 值2:
操作2;
default:
}
一般要结合break,否则满足一个case会自动执行后面的case,case比较不带隐式转换
四、JS动画
通过css完成动画
animate.css动画库
引入.css
加类名
加动画时间
Day04
一、循环结构
1.1while循环
while(条件){ 操作; }
1.2do while循环
do{ 操作; }while(条件)
和while的区别:do while会先执行一次操作
1.3for循环
for(var 循环变量=几;循环条件;循环变量的变化){ 循环体; }
1.4终止循环语句
break;//退出整个循环
continue;//退出本次循环,还会继续做下一次
二、数组的基础
2.1创建
直接量方式: var 数组名=[];
构造函数方式
var arr=new Array(值1,......);
缺陷:面试/笔试中: new Array(3);这是什么意思–创建了一个长度为3的空数组
2.2访问
数组名[下标];
2.3释放一个引用类型的对象
每个变量都要释放后才能释放
2.4关联数组
var 数组名=[]; 数组名["自定义下标"]=值; 访问:arr["自定义下标"];
遍历:把数组中的每一个元素取出来执行相同或相似的操作 问题:不能使用for循环去遍历关联数组,因为length失效了,关联数组的length永远为0,而且我们下标也不再是一个数字
解决:for in 循环
不能设置从哪里开始到哪里结束,所有操作都是自动的
语法
for(var i in 数组名){
i;//自动得到每一个下标
数组名[i];//当前hash数组中的元素了
}
既可以遍历hash数组,也可以遍历索引数组
建议:索引数组依然使用for循环,关联数组使用for in
面试:hash数组的原理:
hash算法:将字符串交给hash算法,会得到一个尽量不重复的数字,但是字符串的内容相同,那么得到的 数字也一定是相同
添加元素:将自定义下标交给hash算法,得到一个数字(地址值),把要保存的数据放进去了 读取元素:将指定的自定义下标交给hash算法,得到一个和添加时完全相同的数字(地址值),通过这个地址值 可以拿到当初保存的东西
三、数组的API
3.1数组转为字符串
var str=arr.join("自定义连接符");
特殊:
-
如果没有传入实参,则和toString效果一致,默认用逗号隔开
固定套路:
-
面试笔试中:完成无缝拼接
arr.join("");
-
将数组元素拼接为页面元素(数据渲染)
获取数据 将数组转为字符串,并拼接上了标签 让字符串上DOM树, innerHTML是识别标签
-
实现二级联动
1.必须使用二维数组,细分每一个,并且二维数组的顺序必须和之前的一维数组对应 2.select.οnchange=function(){} - 状态改变事件,只有选中项发生变化是触发 3.select可以直接获取当前选中项的下标,不需要自定义下标:select.selectedIndex; 4.其实绑定事件,等号左边部分就是你的函数名
3.2拼接数组
var newArr=arr.concat(值1,......)
3.3截取子数组
var subArr=arr.slice(starti,endi);
特殊:
-
不会修改原数组
-
含头不含尾
-
如果只传入了一个实参,则为从starti开始,到末尾
-
如果两个实参都省略,则复制了—份 – 深拷贝!两者互不影响
-
支持负数参数,-n代表倒数第n个
3.4删插替
删除:var del=arr.splice(starti,n);从starti开始删除n个
插入:var del=arr.splice(starti,0,值1,值2...);dels是空数组
替换:var dels=arr.splice(starti,n,值1,值2...);
会改变原数组
3.5翻转数组
arr.reverse();
Day05
一、数组的API
1.1排序
arr.sort(); 会按位比较;
-
希望按照数字排列 - 升序
arr.sort(function(a,b){//匿名回调函数,不需要程序员调用,a是后一个数,b是前一个数 return a-b; //如果a>b,就会返回一个正数,说明后一个数>前一个数 //如果a<b,就会返回一个负数,说明后一个数<前一个数 //如果a==b,就会返回一个0.说明后一个数==前一个数 //而sort的底层就能通过你返回的值来判断要不要帮你交换位置 })
-
希望按照数字排列 - 升序
arr.sort(function(a,b){//匿名回调函数,不需要程序员调用,a是后一个数,b是前一个数 reyurn b-a; })
1.2栈和队列
栈:先进后出
队列:先进先出
开头进:arr.unshift(值,...); 开头出:arr.shift();只能出一个 结尾进:arr.push(值,...); 结尾出:arr.pop();
1.3周期性定时器
名字=serInterval(function(){
操作;
},时间)
停止
clearInterval(名字)
1.4鼠标移入移出
移入:elem.οnmοuseοver=function(){ 操作; } 移除:elem.οnmοuseοut=function(){ 操作; }
二、二维数组
var arr=[ [值,值,...], [值,值,...] ] 使用: arr[][];
特殊:
-
列下标越界,返回undefined
-
行下标越界,列下标不越界,报错(因为行下标越界已经得到undefined,undefined不能使用中括号)
三、String的基础概念
什么是字符串:多个字符组成的【只读】字符【数组】
-
【只读】︰字符串所有的API都不会修改原字符串,只会返回新的字符串
-
【数组】:和数组的相同点
1、字符串可以使用下标获取某个字符
2、字符串可以使用length获取字符的长度
3、字符串可以遍历得到每个字符
4、字符串可以使用数组不修改原数组的API(concat、slice)
和数组的不同点:所有数组直接修改原数组的API,字符串都不可以使用
四、JS内置对象(引用类型):11个
String Boolean Number(包装类型)
包装类型:专门封装原始类型的值,将原始类型悄悄的变成了引用类型的对象(属性和方法)
为什么:前辈们觉得比如字符串经常会被我们拿来做一些操作,为了方便我们程序员,提供了包装类型,把字符串变成了一个对象,提供了我们一些操作字符串的属性和方法,本身原始类型的值,不带有任何属性和方法,意味着不能使用.去做操作
何时使用:只要你试图使用.去操作原始类型的值的时候,包装类型就会悄悄出现
何时释放:方法一旦调用结束,包装类型就会自动释放
为什么undefined和null不能使用. ,他们俩没有提供过包装类型(没有任何属性和方法)
Array、Function、Data(日期) 、 Math(数学) 、 RegExp(正则:验证)、
Error(错误)
Object(面向对象)
Global(全局对象):1、保存着全局变量和全局函数,只不过浏览器端/客户端/前端global被window代替了,Node.js后端语言的时候全局是global
2、唯独window对象可以省略不写