第二周JS知识梳理
day04
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.length;i++){
arr[i];
}
day05
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;
4、操作元素:
内容: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->当前触发事件的元素
}
day06
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();
day07
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<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c])
}
}
day08
1、String API:
预定义好的方法,我们程序员可以直接用,但是只有字符串可以使用 - 只读
1、转义字符:\
作用:
1、解决和程序冲突的符号:
"\""
2、换行:\n 制表符:\t
3、书写unicode编码:\u4e00-\u9fa5
2、*做验证码的判断
大写:var newStr=str.toUpperCase();
小写:var newStr=str.toLowerCase();
3、获取指定位置的字符:
str.charAt(i) === str[i]
4、获取指定位置的字符的ascii码:
var ascii=str.charCodeAt(i)
通过ascii码转回原文:var 原文=String.fromCharCode(ascii);
5、*检索字符串:
获取关键字的下标
var i=str/arr.indexOf("关键字",starti);
作用:判断有没有
为不为-1,为-1说明没有,不为-1说明有
6、拼接字符串:
str.concat() === 还不如+运算
7、*截取字符串:
var subStr=str/arr.slice(starti,endi+1);
var subStr=str.substring(starti,endi+1);//不支持负数参数
var subStr=str.substr(starti,n);//n代表的是截取的个数,不必考虑含头不含尾
8、*替换字符串:
var newStr=str.replace("固定关键字"/RegExp,"新内容");
9、*切割字符串:
作用:将字符串=>数组
var arr=str.split("自定义的切割符");
特殊:
1、切割后,切割符不在存在
2、如果切割的是"",每个字符都会被切散