js高级篇

目录

1、作用域

2、let、const、var

3、作用域链

4、垃圾回收机制

5、闭包

6、变量提升

7、函数提升

8、剩余参数

9、展开运算符

10、箭头函数

11、filter筛选数组方法

12、数组解构

13、对象解构

15、数组对象

16、数组遍历foreach

17、数组去重


1、作用域

作用域:变量能够被访问的范围

作用域分为局部作用域和全局作用域;

局部作用域:函数作用域:函数内部声明的变量,只能内部访问,外部无法直接访问,函数在执行之后,函数内部的变量实际被清空了。

块级作用域:使用{}包裹的代码具有块级作用域。一般是for和if
全局作用域: <script>标签和.js文件的最外层或者从根部global出发的叫做全局作用域,全局作用域中声明的变量在html文件内部都可以访问,尽量少声明全局变量,防止全局变量被污染。

2、let、const、var

let和const有块级作用域,出现暂时性死区,其中const是常量,必须赋值,赋值后不可以修改

var没有块级作用域,会有变量提升

3、作用域链

作用域链:本质上是底层的变量查找机制,采取就近原则,函数被执行的时候,先在当前作用域查找变量,如果查不到往上一级作用域进行查找,直到全局作用域

4、垃圾回收机制

JS垃圾回收机制:简称GC,内存在不进行使用的时候会被清除,全局变量一般不会回收(关闭页面时回收)内存泄漏:用不到的内存,没有及时被清理掉,叫做内存泄漏
垃圾回收算法:引用计数法---缺陷:嵌套引用,如果两个对象,相互引用,会导致内存泄漏
标记清除法---从根部出发进行查找,无法被访问到的我们进行回收

5、闭包

闭包:内部函数访问到外部函数的作用域就会产生闭包
闭包的作用:外部也可以访问函数内部的变量,避免了全局变量污染闭包的缺陷:会造成内存泄漏
注意:回调函数也能访问函数内部的局域变量

6、变量提升

变量提升:变量声明之前就可以被访问,变量提升只提升声明,不提升赋值

 // 1. 把所有var声明的变量提升到 当前作用域的最前面
      // 2. 只提升声明, 不提升赋值
      // var num
      // console.log(num + '件')
      // num = 10
      // console.log(num)
      fn()
      function fn() {
        console.log(num)
        var num = 10
      }

7、函数提升

提升函数提升:是指函数在声明之前就可以被调用,如果是用变量接收一个函数也就是函数表达式不存在函数提升参数:声明函数的时候传入的是形参,调用函数的时候传入的是实参

8、剩余参数

动态参数: arguments,是个伪数组,只存在于函数中,能够动态获取函数的实参
剩余参数:...是语法符号,放在最未函数的形参之前,获取剩余的实参,是一个真数组,开发中提倡使用

<script>
      // arguments 动态参数 只存在于 函数里面
      // 是伪数组 里面存储的是传递过来的实参
      // console.log(arguments)  [2,3,4]
      function getSum() {
        let sum = 0
       
        for (var i = 0; i < arguments.length; i++) {
          console.log(arguments[i])
          sum += arguments[i]
        }
        console.log(sum)
      }
      getSum(3,57,9,6,42,432,43)
    </script>

9、展开运算符

展开运算符:可以将一个数组进行展开,不会修改原数组
展开运算符: 可以展开数组、合并数组、将伪数组转化为真数组

 展开运算符 可以展开数组
      console.log(...arr)
      console.log(Math.max(1, 2, 3))
      ...arr1  === 1,2,3
      1 求数组最大值
      console.log(Math.max(...arr1)) // 3
      console.log(Math.min(...arr1)) // 1
      2. 合并数组3、可以把伪数组转化为真数组
      const arr2 = [3, 4, 5]
      const arr = [...arr1, ...arr2]
      console.log(arr)


剩余参数和展开运算符的区别:剩余参数:函数参数使用,得到真数组
 

10、箭头函数

箭头函数:
const fn = O=>{
console.log('我是箭头函数)
fnO
注意:

1.只有一个函数的时候可以省略小括号
2.如果函数体只有一行代码可以写到一行上
3.再写到一行上的时候可以无需写return直接写返回值4.加括号的函数体返回对象字面量表达式
const fn = uname => ({uname: uname})console.log(fn('我是个好人'))
箭头函数参数:箭头函数没有arguments动态参数,可以使用剩余参数
箭头函数this:箭头函数没有自己的this,它只会从自己的作用域链上一级沿用this,事件回调函数中使用箭头函数的时候,this为全局的window。

 // 1. 箭头函数 基本语法
      const fn = () => {
        console.log(123)
      }
       fn()
    const fn = (x) => {
        console.log(x)
      }
    fn(1)
      // 2. 只有一个形参的时候,可以省略小括号
       const fn = x => {
       console.log(x)
     }
      fn(1)
      // // 3. 只有一行代码的时候,我们可以省略大括号
      const fn = x => console.log(x)
       fn(1)
      // 4. 只有一行代码的时候,可以省略return
      const fn = x => x + x
      console.log(fn(1))
      // 5. 箭头函数可以直接返回一个对象
     const fn = (uname) => ({ uname: uname })
     console.log(fn('刘德华'))

11、filter筛选数组方法

筛选数组方法: filter(),返回数组,包含了符合条件的所有元素,如果没有符合条件的元素返回空数组,看的是回调函数返回值的布尔值
被遍历的数组.filter(function(item,index, arr){l/ item必须写,index,arr可选
return 筛选条件
})

 const arr = [10, 20, 30]
    const newArr = arr.filter(function (item, index) {
      // console.log(item)
      // console.log(index)
      return item >= 20
    })
 // 返回的符合条件的新数组


对象:无序的键值对的集合

12、数组解构

解构赋值:是一种快速为变量赋值的语法,本质上仍然是为变量赋值,分为数组解构、对象解构;

数组解构:是将数组的单元值快速批量的赋值给一系列变量的语法

注意:

1.赋值运算符=左侧的[用于批量声明变量,右侧的数组的单元值将被赋值给左侧的变量
2.变量的数量大于单元值数量的时候,多余的变量被赋值为underfind
3.变量的数量小于单元值数量的时候,可以通过...获取剩余单元值,但只能置于最末位对象解构:

const arr = [1, 2, 3]
      const [a, b, c] = arr
      console.log(a, b, c
// // 交换2个变量的值
      let a = 1
     let b = 2
       ;[b, a] = [a, b]
       console.log(a, b)

13、对象解构

对象解构:是将对象属性和方法快速批量赋值给一系列变量的语法
注意:

1.赋值运算符=左侧的用于批量声明变量,右侧对象的属性值将被赋值给左侧的变量
⒉.对象属性的值将被赋值给属性名相同的变量
3.对象中找不到与变量名相同的属性名的时候变量值为underfined

4.给新的变量名赋值:
const { name : uname,age } = { name : '小明’, age : 183

// 1. 对象解构的变量名 可以重新改名  旧变量名: 新变量名
     const { uname: username, age } = { uname: 'pink老师', age: 18 }

    console.log(username)
    console.log(age)

14、JS前面有两哪种情况需要加分号的?

1、立即执行函数 

2、数组解构

15、数组对象

const res = {
        data: {
          data: [1, 2, 3],
        },
 const {data:{data: mydata}}=res
      console.log(mydata)

16、数组遍历foreach

遍历数组forEach方法:用于调用数组的每个元素,并将元素传递给回调函数,在特殊情况下:通过修改index,arr可以修改原数组,item如果是简单数据类型修改不了原数组,如果是复杂数据类型可以修改原数组。

17、数组去重

数组去重reduce方法:

const arr = ['a', 'b', 'a', 'b', 'C', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
//如果indexof下标为-1代表数组中没有该字符,把该字符添加进去
let res = arr.reduce((acc, item)=>{
if (acc.indexof(item)===-1){
acc.push(item)
}
return acc
},[])
console.1og(res)

数组去重Set方法:

const arr =['a', 'b', 'a', 'b', 'c', 'e', 'e', 'e', 'd', 'd', 'd', 'd']
const newArr = [. ..new Set(arr)]//展开式
console.log(newArr)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值