ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(二)

简介: ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(二)

3. 变量的解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。

3.1 数组的结构

const arr = ['apple', 'banner', 'orange']
    // 相当于声明了三个变量 fruit1, fruit2, fruit3 
    // 将数组 arr 中的值按下标顺序赋值给三个变量
    // 数组的解构使用 []
    let [fruit1, fruit2, fruit3] = arr
    console.log(fruit1)
    console.log(fruit2)
    console.log(fruit3)

3.2 对象的解构

const person = {
      name: 'zs',
      age: 13,
      sayHello: function() {
        console.log('Hello!')
      }
    }
    // 对象的解构是按照对象中的属性名将属性值赋值给相同名对应的变量
    let {name, age, sayHello} = person
    console.log(name)
    console.log(age)
    sayHello()
    // 对象解构赋值的用处
    // person.sayHello() 麻烦
    // 解构出来,直接调用,不用每次写对象名
    sayHello()

// 对象解构可以单独解构出其中的属性
    let {sayHello} = person
    sayHello()

频繁使用对象方法、数组元素,就可以使用解构赋值形式

4. 模板字符串

模板字符串(template string)是增强版的字符串,用反引号( ` )(键盘esc键下面)标识,特点:

  1. 字符串中可以出现换行符
  2. 可以使用 ${xxx} 形式输出变量

4.1 模板字符串声明

let str = `声明了一个模板字符串`
    console.log(str)

4.2 字符串中可以出现换行符

let str = `
      <ul>
        <li></li>  
        <li></li>  
        <li></li>  
      </ul>
    `
    console.log(str)

4.3 可以使用 ${xxx} 形式输出变量

let name = 'zs'
    let age = 13
    let str = `我的名字是${name}, 我的年龄为${age}`
    console.log(str)

当遇到字符串与变量拼接的情况使用模板字符串

5. 简化对象写法

ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

let name = 'zs'
    let age = 12
    let sayHello = function() {
      console.log('你好!')
    }
    let person1 = {
      name,
      age,
      sayHello,
      sayHello2() {
        console.log('hello!')
      }
    }
    // 相当于
    // let person2 = {
    //   name: name,
    //   age: age,
    //   sayHello: sayHello,
    //   sayHello2: function() {
    //     console.log('hello!')
    //   }
    // }
    console.log(person1.name)
    console.log(person1.age)
    person1.sayHello()
    person1.sayHello2()

6. 箭头函数

ES6 允许使用箭头(=>)定义函数。

// 定义一个普通的函数
    let f1 = function() {
      console.log('hello')
    }
    // 定义箭头函数
    let f2 = () => {
      console.log('world')
    }
    f1()
    f2()

6.1 箭头函数 this 指向声明时所在作用域下 this 的值

箭头函数的 this 是静态的. this 始终指向函数声明时所在作用域下的 this 的值

function getThis1() {
        console.log(this)
      }
      let getThis2 = () => {
        console.log(this)
      }
      // 直接调用
      getThis1()
      getThis2()

function getThis1() {
        console.log(this.name)
      }
      let getThis2 = () => {
        console.log(this.name)
      }
      window.name = 'window'
      const NAME = {
        name: 'NEW_NAME'
      }
      // 使用call方法改变this指向
      getThis1.call(NAME)
      getThis2.call(NAME)

箭头函数的this指向并没有发生更改,依旧指向声明时候作用域下的this(window)

6.2 箭头函数不能作为构造实例化对象

let Person = (name, age) => {
        this.name = name
        this.age = age
      }
      let p = new Person('zs', 12)
      console.log(p)

6.2.1 函数this指向

函数this的指向在函数定义的时候是不能确定的,在调用执行函数时才能明确函数this的指向。

  1. 函数名() 调用函数,this指向window
  2. 对象名.函数()this指向调用这个函数的对象
  3. 函数作为事件处理函数时,this指向触发事件的元素
  4. 构造函数中的this指向new出来的对象
  5. 定时器函数中的this指向window

6.3 不能使用 arguments 变量

// 普通函数可以使用 arguments 变量获取传入的参数值
      let fn1 = function() {
        console.log(arguments)
      }
      // 箭头函数不能使用 arguments 变量获取传入的参数值
      let fn2 = () => {
        console.log(arguments)
      }
      fn1(1,2,3)
      fn2(1,2,3)

6.4 箭头函数的简写

6.4.1 如果形参只有一个,则小括号可以省略

let fn3 = n => {
        console.log(n)
      }
      fn3(100)

6.4.2 函数体如果只有一条语句,则花括号可以省略

函数体如果只有一条语句,则花括号可以省略,函数的返回值为该条语句的

执行结果

let fn4 = n => console.log(n)
      fn4(100)
      let fn5 = n => n*n
      // 相当于:
      // let fn5 = n => {
      //   return n*n
      // }
      let res = fn5(100)
      console.log(res)

6.5 箭头函数实践

6.5.1 点击 div 2s 后颜色变成『粉色』

普通函数实现:

// 获取元素
      let div = document.querySelector('div')
      // 绑定事件
      div.addEventListener( 'click', function() {
        // 回调函数使用普通函数
        // 由于定时器函数的this指向window
        // 需要保存this,事件处理函数指向触发事件的元素
        let _this = this
        setTimeout( function() {
          _this.style.background = 'pink'
        }, 2000 )
      } )

箭头函数实现:

// 获取元素
      let div = document.querySelector('div')
      // 绑定事件
      div.addEventListener('click', function () {
        // // 回调函数使用普通函数
        // // 由于定时器函数的this指向window
        // // 需要保存this,事件处理函数指向触发事件的元素
        // let _this = this
        // setTimeout(function () {
        //   _this.style.background = 'pink'
        // }, 2000)
        // 箭头函数实现
        // 由于箭头函数this指向定义函数作用域下的this,所以箭头函数this指向触发事件的元素
        setTimeout(() => {
          this.style.background = 'pink'
        }, 2000)
      })

6.6 箭头函数小结

  • 箭头函数适合与 this 无关的回调. 定时器, 数组的方法回调
  • 箭头函数不适合与 this 有关的回调. 事件回调, 对象的方法


相关文章
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
158 1
|
4月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
388 1
|
1月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
5月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
314 121
|
8月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
238 2
|
5月前
|
存储 C++ 容器
unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
256 0
|
5月前
|
编译器 C++ 容器
用一棵红黑树同时封装出map和set
再完成上面的代码后,我们的底层代码已经完成了,这时候已经是一个底层STL的红黑树了,已经已符合库里面的要求了,这时候我们是需要给他穿上对应的“衣服”,比如穿上set的“衣服”,那么这个穿上set的“衣服”,那么他就符合库里面set的要求了,同样map一样,这时候我们就需要实现set与map了。因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。我们就可以使用仿函数了。
73 0
|
5月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
245 0
|
9月前
|
编译器 容器
哈希表模拟封装unordered_map和unordered_set
哈希表模拟封装unordered_map和unordered_set

热门文章

最新文章