8.28 冯娜
学习日志
今天学习了函数中的重载、参数按值传递、作用域和作用链域、闭包、对象、数组。
一、重载(overload):
1、什么是重载: 相同函数名,不同参数列表的多个函数,在调用时,根据传入参数的不同,自动选择匹配的函数执行 。
2、为什么使用重载: 减少API的数量,减轻调用者的负担 。
3、什么时候使用重载: 只要一项任务,需要根据不同的参数,执行不同的操作时,就需要使用重载 。
4、重载问题: JS语法不支持重载,JS中不允许多个同名函数同时存在 。
5、解决重载问题: 每一个函数内,都有一个arguments对象接住所有传入函数的参数值,根据arguments的元素内容或元素个数,判断执行不同的操作 。
6、arguments: 函数调用时,自动创建的,自动接收所有传入函数的参数值。arguments其实是一个类数组对象 。
案例:
function girl (a){
switch(arguments.length){
case 1:console.log("一个啦");
case 2:console.log("两个噶");
case 3:console.log("三个哈");
}
}
girl ("a","b","c")
结果为:
若girl("a","b")
结果为:
若girl("a")
二、参数按值传递:
1、原始类型按值传递:
var a=1;
var b=a;
b=2;
console.log(a,b) //1 2
2、引用类型的传递:
var obj1={
name:"hh",
sex:"女",
}
var obj2=obj1;
obj2.name="aaaa";
console.log(obj1.name)//aaaa
三、作用域和作用链域:
1、作用域: 变量的可作用范围,其实是一个对象 。
全局作用域对象: 全局作用域对象(window),保存全局变量 。优点:可反复使用;缺点:缺点:随处可用,容易造成全局污染,我们建议尽量少用全局变量。
函数作用域对象: 函数作用域对象(AO),保存局部变量 。
包含:参数变量、函数内var声明的变量。
优点:仅函数内可用,不会被污染。缺点:不可重用。
案例:
var name="one";
function test(){
var name="two";
function test1(){
var name ="three";
console.log(name);//three
}
function test2(){
console.log(name);//two
}
test1();
test2();
}
test();
2、函数的生命周期:
开始执行程序前;定义函数时;调用函数时;调用后。
四、闭包:
1、什么是闭包: 即重用变量,又保护变量不被污染的机制 。
2、为什么使用闭包:全局变量:优点:可重用;
局部变量:优点:不会被污染;
3、使用闭包:
var p=(function(){
var q;
return function () {
return q="哈哈哈技术大咖";}
})()
a=p()
console.log(a)//哈哈哈技术大咖
4、闭包如何形成:
外层函数调用后,外层函数的作用域对象(AO),无法释放,被内层函数对象的scope引用着 。
缺点:1. 比普通函数占用更多内存,多的是外层函数的作用域对象(AO)始终存在。
- 容易造成内存泄漏。
5、解决如何释放闭包:show[0]=null
6、理解闭包的流程:
- 找受保护的的变量,确定外层函数调用后,受保护变量的最终值。
- 找操作受保护的变量的内层函数对象。
注意:同一次外层函数调用,返回的内层函数对象,共用同一个受保护的变量。
五、对象:
1、什么是对象:
对象是一组属性(property)和方法(method)的集合,对象属于引用类型数据 。
2、JS对象分类:
A、内置对象:
什么是内置对象: ES标准中规定的,浏览器厂商已经实现的对象,即JS官方提供的对象 。
API:Math、Date、Number、Boolean、Error、Function
B、宿主对象: 由ECMAScript实现的宿主环境提供的对象,可以理解为 “ 浏览器提供的对象 ”。所有的BOM和DOM都是宿主对象 。
C、自定义对象: 自定义对象就是自己创建的对象(对象字面量/内置构造函数/自定义构造函数) 。
案例:
console.log(Math.ceil(2.2222))//3
console.log(Math.floor(2.999))//2
console.log(Math.round(2.3))//2
console.log(Math.round(2.6))//3
console.log(Math.pow(4,2))//16
console.log(Math.sqrt(16))//4
console.log(Math.abs(-18))//18
console.log(Math.PI)
var arr=[3,6,9,1,4,2]
console.log(Math.max.apply(null,arr))//9
console.log(Math.min.apply(null,arr))//1
console.log(Math.random()*100+1)//1~100
var num=3.18397781
console.log(num.toFixed(3))//3.184
var n=9
console.log(n.toString(2))//00001001
var bool=new Boolean('str');
console.log(new Boolean("hh"))//Boolean{true}
console.log(Boolean("hh"))//true
var fn=new Function("a","b","console.log(a);return b")
var show=fn(1,2)
console.log(show)//1 2
D、访问对象中的属性
E、遍历对象中的属性
F、判断对象中是否含有某个属性
G、全局函数
六、数组:
1、什么是数组:
数组是由多个元素组成的集合,每个元素就是一个数据,而数组元素是保存在数组中的一个数据 。
数组是引用类型,按值传递。
2、创建数组:
A、创建空数组:
数组直接量:var arr=[];
使用内置构造函数:var arr=new Array();
B、创建数组同时初始化数组元素:
数组直接量:var arr=[值1,值2,....];
使用内置构造函数:var arr=new Array(值1,值2,....);
C、创建含有n个空元素的数组:
var arr =new Array(n)
例:var arr= new Array(3);
arr[0]='"name";
arr[1]="sex";
arr[2]="age";
3、数组元素的访问:数组[下标]
4、数组的长度:数组名.length
感觉今天的内容比较难,听的时候感觉懂了,写的时候也可以写出来,但是晚上就忘了,要多看,多敲,多想。
评论