学习:JS[9]作用域+函数进阶+深入对象+实例成员和静态成员
一.作用域
var不会产生块作用域
1.垃圾回收机制
a.内存的生命周期
- 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
- 内存使用:即读写内存,也就是使用变量、函数等
- 内存回收:使用完毕,由垃圾回收期自动回收不再使用的内存
b.说明
- 全局变量一般不会回收
- 一般情况下局部变量的值不使用会被回收
c.内存泄漏:程序中分配的内存由于某种原因程序未释放或无法释放叫做内存泄漏
2.闭包
闭包=内层函数+外层函数的变量
闭包作用:封闭数据,提供操作,外部也可以访问函数内部的变量
可以实现数据私有,不能随意修改,里面的变量不会被回收
3.变量提升
- 把所有var声明的变量提升到当前作用域的最前面
- 只提升声明,不提升赋值
二.函数进阶
1.函数提升
函数在声明之前
提升只提升变量,不提升赋值
2.函数参数
a.动态参数
arguments只存在函数内部的伪数组变量,包含了调用函数时传入的所有实参
b.剩余参数
函数参数里的(...变量名)
是一个真数组(可以使用pop,push方法)
function getSum(a,b,...arr){console.log(arr)
}
getSum(2,3)
getSum(1,2,3,4,5)
//输出结果是第一个是[],因为将2给了a,3给了b,arr就为空
//第二个是[3,4,5],因为将1给了a,2给了b,3,4,5给了arr
3.箭头函数(重要)
目的:引入箭头函数的目的是更简短的函数写法并且不绑定this
使用场景:箭头函数更适用于那些本来需要匿名函数的地方
a.基本语法
const fn=() =>{函数内容}
fn()//调用函数//省略小括号的情况
const fn=x =>{
函数内容
}
fn(1)//省略大括号的情况
const fn=x => console.log(x)
fn(1)//只有一行代码且有return的时候,可以省略大括号和return
const fn=x => x+x
fn(1)//箭头函数可以直接返回一个对象
const fn=(uname)=>({name:uname})
fn('刘德华')
- 只有一个形参的时候小括号可以省略
- 只有一行的时候,大括号可以省略
- 只有一行代码且有return的时候,可以省略大括号和return
- 箭头函数可以直接返回一个对象
b.箭头函数参数
- 普通函数有arguments动态参数
- 箭头函数没有arguments动态参数,但是有剩余参数...args
c.箭头函数this
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层沿用this
三.解构赋值
1.数组解构
赋值运算符将数组的单元值快速批量赋值给一系列变量的简洁语法
a.交换两个变量
let a=1
let b=2;//一点要加分号,不然会报错
[b,a]=[a,b]
只要以数组开头的在前面加一个分号用来隔开
2.对象解构
a.语法
const {uname,age}={uname:'pink老师',age:'18'}//变量名可以重新改名
const {uname:username,age}={uname:'pink老师',age:'18'}
b.多级对象解构
根据给的多级对象解构,定义相同结构
3.遍历数组forEach方法(重点)
调用数组的每个元素,并将元素传递回回调函数
a.语法
被遍历的数组.forEach(function(当前数组元素,当前元素索引号){
//函数体
})
4.筛选数组filter方法(重点)
筛选数组复合条件的元素,并返回筛选之后元素的新数组
a.语法
const arr = [10, 20, 30]
const newArr= arr.filter(function (item, index) {return item >= 20})
四.深入对象
1.创建对象的三种方式
a.利用对象字面量创建对象
const obj={
name:'嘿嘿'
}
b.利用new Object创建对象
const obj=new Object({uname:'呵呵'})
2.利用构造函数构造
构造函数:是一种特殊的函数,主要用来初始化对象
使用场景:通过构造函数来快速创建多个类似的对象
a.约定
- 命名以大写字母开头
- 有"new"执行
//1.
function Pig(uname,age){
this.uname=uname//第一个是pig对象里面的属性,后一个是形参
this.age=age
}
new Pig('佩奇',6)//2.
const peppa=new Pig('佩奇')
3.实例成员&静态成员
a.实例成员
- 在实例对象中的属性叫实例成员
- 创建构造相同但值不同的对象
- 彼此独立互不影响
b.静态成员
构造函数的属性和方法称为静态成员
静态成员只能构造函数来访问
静态方法中的this指向构造函数
比如:Date.now() Math.PI Math.random()