1、循环结构:通过条件的判断,看要不要反复执行某些代码块
1、while
var 循环变量=几;
while(循环条件){
循环体;
变量变化;
}
2、for
for(var 循环变量=几;循环条件;变量变化){
循环体;
}
3、do...while:
var 循环变量=几;
do{
循环体;
变量变化;
}while(循环条件)
和while的区别,只看第一次,如果条件满足,两者没有区别,如果条件不满足,while一次都不会执行,do...while至少执行一次
4、死循环:
while(true){循环体}
for(;;){循环体}
5、退出循环的语句:
break - 退出整个循环,搭配死循环使用
continue - 退出本次循环
2、函数的基础:方法,需要先预定义好,以后可以反复使用的代码段
1、创建 - 不会自动使用
function 函数名(){
函数体;
}
2、调用:
在JS里面直接写:函数名(); - 程序员自己写几次就会执行几次
在HTML上绑定事件:
3、以后何时使用函数:
1、不希望打开页面立刻执行
2、希望用户来触发
3、函数是第一等公民
4、每一个独立的功能都要封装为一个函数
4、发现:好像和前辈们提供的函数用法有一点点不一样:parseInt(str) - 带参数的函数
1、创建
function 函数名(形参,...){//形参就是变量,默认值为undefined
函数体;
}
2、调用:函数名(实参,...) 1、自定义Function的深入了解:
1、创建的方式:3种,但是目前只学了2种
1、声明方式:
function 函数名(形参列表){
函数体;
return 结果;
}
2、直接量方式:
var 函数名=function(形参列表){
函数体;
return 结果;
}
2、调用:var result=函数名(实参列表);
3、作用域:
全局:全局变量 和 全局函数,在任何位置都可以使用
函数:局部变量 和 局部函数,只能在函数调用时内部可用
带来了变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错
缺点:
1、全局用不到局部的,但是搭配上return即可解决
2、不要再函数内对未声明的变量赋值,会导致全局污染,降低性能
4、声明提前:再程序正式执行之前,会悄悄的将var声明的变量(轻)和function声明的函数(重),集中提前到当前作用域的顶部,但是赋值留在原地
5、重载:相同的函数名,根据传入的实参的不同,自动选择对应的函数执行,但是JS不支持,因为同名函数出现,后面的会覆盖前面的
解决:arguments - 类数组对象,跟数组长得很像
作用:哪怕没有形参,也可以接住所有的实参
用法:arguments[1] - 得到的是第二个实参
arguments.length - 获取到传入的实参有几个
变相实现重载:我可以再函数内部判断实参的不同执行不同的操作
2、数组:一个变量可以保存多个数据
1、创建:2种
1、直接量:var arr=[数据,...];
2、构造函数:var arr=new Array(数据,...);
2、访问:arr[i];
3、添加/替换:arr[i]=新数据;
4、数组具有三大不限制:
1、不限制长度
2、不限制类型
3、不限制下标越界:
访问:下标越界 - 得到undefined
添加:下标越界 - 变成稀疏数组,如果搭配上遍历,则为会得到很多undefined
5、数组唯一的属性:arr.length - 获取到数组的长度,最大下标 === 长度-1
三个固定套路:
1、向末尾添加:arr[arr.length]=新值;
2、获取倒数第n个:arr[arr.length-n];
3、删除倒数n个:arr.length-=n
6、遍历数组:往往不是取出某个来使用,而是取出所有来执行 相同 或 相似的操作
for(var i=0;i
arr[i];
} 1、DOM:Document Object Model:文档对象模型,专门用于操作HTML文档的,提供了很多的方法
2、DOM树:树根document对象,可以通过它找到我们需要的元素
3、查找元素:
1、HTML特点
ID:其实不用找,直接可用
标签名和class名:var elems=document/爸爸.getElementsByTag/ClassName("标签名/class名");
没找到是一个空集合,而且集合不能直接用于做操作,要么下标拿到某个元素,要么遍历拿到每个元素
不一定非要从document开始,可以写为一个自己已经找到的父元素
2、关系:前提:至少要先找到一个人,才可使用关系
父:elem.parentNode;
子:elem.children;
第一个儿子:elem.firstElementChild;
最后一个儿子:elem.lastElementChild;
前一个兄弟:elem.previousElementSibling;
后一个兄弟:elem.nextElementSibling;
2、操作元素:
内容:innerHTML(双标签,识别标签)/innerText(双标签,纯文本)/value(input专属)
获取:elem.以上三个中的一个
设置:elem.以上三个中的一个="新值"
属性:
获取:elem.getAttribute("属性名"); ===> elem.属性名
设置:elem.setAttribute("属性名","属性值") ===> elem.属性名="新值"
特殊:简化版:
1、class必须写为className
2、自定义属性不能使用简化版
样式:操作内联
获取:elem.style.css属性名 - 只能获取到内联样式
设置:elem.style.css属性名="css属性值";
绑定事件:我们要让HTML(内容)和CSS(样式)和JS(行为)分离
elem.on事件名=function(){//回调函数,是不需要程序员去调用的,在你点击的时候,会自动调用
操作;
关键字:this->目前只能在事件之中使用
单个元素绑定事件,this->就是这个元素
多个元素绑定事件,this->当前触发事件的元素
} 1、数组的基础 - 填坑
1、创建数组:var arr=new Array(num);//创建了一个长度为num的空数组
2、按值传递:主要看传递的类型
1、如果传递的是原始类型,两者互不影响,因为是复制了一个副本给对方
2、如果传递的是引用类型,两者相互影响,因为是把自己的地址值给了对方 - 浅拷贝
3、释放引用类型,一定要看清楚有几个变量引用着,都要释放后才能是放干净,推荐还是使用函数封装,可以自动释放
2、hash数组:下标是可以自定义的,便于查找
1、创建:2步
1、创建空数组:var arr=[];
2、为空数组添加自定义下标并且赋值:arr["name"]="袍哥";
2、访问:arr["name"]
3、遍历:length失效了,必须使用for in循环
for(var i in arr){
arr[i]
}
4、JS中万物皆对象,除了undefined和null,一切对象的底层都是hash数组
3、*数组的API:这些预定义方法,只有数组可以使用
1、arr to str:var str=arr.join("自定义连接符");
固定套路:
1、无缝拼接:arr.join("");
2、拼接为页面元素:"<开始>"+arr.join("<开始>")+""; - 搭配上innerHTML使用
2、拼接数组:添加元素的新方式
var newArr=arr.concat(新值1,arr2,....);
3、截取子数组:取出某一部分
var subArr=arr.slice(starti,endi+1);
4、删插替:var dels=arr.splice(starti,n,新值1,...);
5、翻转:arr.reverse(); 1、ArrayAPI:
1、排序:
1、笔试时,冒泡排序
2、开发时使用API:
arr.sort();//按字符串排序
arr.sort((a,b)=>a-b);//升序
arr.sort((a,b)=>b-a);//降序
2、栈和队列:这四个方法可以混搭使用
开头进:arr.unshift(新值1,...);
开头出:var first=arr.shift();
结尾进:arr.push(新值1,...);
结尾出:var last=arr.pop();
3、ES5 - 新的API:
1、判断:
var bool=arr.every/some((val,i,arr)=>判断条件);
2、遍历:
arr.forEach((val,i,arr)=>操作);
var newArr=arr.map((val,i,arr)=>操作);
3、过滤:var subArr=arr.filter((val,i,arr)=>判断条件);
汇总:var sum=arr.reduce((prev,val,i,arr)=>prev+val);
2、二维数组:希望在数组中,再次细分分类
var arr=[[],[],[],[]]
访问:arr[行][列]
列下标越界,得到undefined
行下标越界,会报错
遍历二维数组:必须两层循环,外层循环控制行,内层循环控制列
for(var r=0;r
for(var c=0;c
console.log(arr[r][c])
}
}