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)始终存在。

  1. 容易造成内存泄漏。

5、解决如何释放闭包:show[0]=null

6、理解闭包的流程:

  1. 找受保护的的变量,确定外层函数调用后,受保护变量的最终值。
  2. 找操作受保护的变量的内层函数对象。

注意:同一次外层函数调用,返回的内层函数对象,共用同一个受保护的变量。

五、对象:

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

​ 感觉今天的内容比较难,听的时候感觉懂了,写的时候也可以写出来,但是晚上就忘了,要多看,多敲,多想。

评论