学习笔记-ES6

1.let

  • let变量不能重复声明,var变量可以重复声明

  • 块级作用域 全局 函数 eval

    • 变量只在代码块内部有效

      • {
        	let girl = '周扬青' 
        }
        console.log(girl) // girl未定义
        
        {
        	var girl = '周扬青' 
        }
        console.log(girl) // girl有定义
        
        
  • 不存在变量提升

    • console.log(song) // undefined
      ver song = '恋爱达人'
      
      // 实际上相当于
      var song;
      console.log(song) // undefined
      ver song = '恋爱达人'
      
    • let不允许变量声明之前使用变量

  • 不影响作用域链

    • {
        let school = 'Tabjin'
        
        function fn() {
          console.log(school)
        }
        
        fn()
      }
      

let案例

// 遍历绑定事件,这边会有一个越界问题
for (var i = 0; i < items.length; i++) {
    items[i].onclick = function () {
    	// 修改当前元素的背景颜色
      items[i].style.background = 'pink'
    }
}

// 通过let解决
for (var i = 0; i < items.length; i++) {
    items[i].onclick = function () {
    	// 修改当前元素的背景颜色
      items[i].style.background = 'pink'
    }
}

2.const

3.变量的解构赋值

4.模板字符串

5.箭头函数

1.几个注意点

  1. 箭头函数的this是静态的,this始终指向函数声明时所在作用域下的this的值。普通函数谁调用this指向谁

    1. function getName() {
        console.log(this.name)
      }
      
      let getName2 = () => {
        console.log(this.name)
      }
      
      // 设置window对象的name属性
      window.name = 'Tabjin'
      const school = {
        name: 'wawo'
      }
      
      // 直接调用
      getName();// Tabjin
      getName2();// Tabjin
      
      // call方法调用,call可以改变函数内部this的值
      getName.call(school)// wawo
      getName2.call(school)// Tabjin 箭头函数的this是静态的,this始终指向**函数声明时**所在作用域下的this的值
      
  2. 不能作为构造函数实例化对象

    1. let Person = (name, age) => {
        this.name = name
        this.age = age
      }
      let me = new Person('xiao', 30)
      console.log(me)
      
  3. 不能使用arguments变量

    1. arguments是用来保存实参的

    2. let fn = () => {
        console.log(arguments)
      }
      
      fn(1, 2, 3)// arguments
      
  4. 箭头函数简写

    1. 省略小括号,当形参有且只有一个的时候

      1. let add = n => {
          return n + n
        }
        
    2. 省略花括号,当代码体只有一条语句的时候,此时return语句必须省略

      1. let pow = n => n*n
        

2.使用场景

let ad = document.getElementById('ad')
ad.addEventListener('click', function() {
  let _this = this
  setTimeout(function() {
    _this.style.abckground = 'pink'
  })
})

ad.addEventListener('click', () => {
  setTimeout(function() {
    this.style.abckground = 'pink'
  })
})

const arr = [1,6,9,10,100,25]
const  result = arr.filter(function(item) {
  if(item % 2 === 0) {
    return true
  }else {
    return false
  }
})

// 或
const  result = arr.filter(item => item % 2 === 0)

console.log(result)

箭头函数适合与 this 无关的回调,定时器,数组的方法的回调

箭头函数不适合与this有关的回调,事件回调,对象的方法

6.rest参数

ES6引入了 rest 参数,用于获取函数的实参,用来代替 arguments

// ES5获取实参的方式
function date() {
  console.log(arguments)
}

data('白芷', '阿娇', '思慧')

// ES6 rest参数
function data(...args) {
  console.log(args)
}

data('白芷', '阿娇', '思慧')// 这边返回filter some every map

Tip

rest参数必须要放到参数最后

7.扩展运算符

将数组转换为逗号分隔的参数序列

  • 数组合并[...array1, ...array2]

  • 数组克隆:现有array1 = ['A', 'B', 'C'],array2 = [...array1],注意,这边要是有引用类型的数据拷贝的话是浅拷贝

  • 将伪数组转为真正的数组

    • const divs = document.querySelectorAll('div')
      const dirArr = [...divs]
      

8.Symbol

第七种原始数据类型,是一种类似于字符串的数据类型。

  • Symbol的值是唯一的,用来解决命名冲突问题
  • Symbol值不能与其他数据进行运算
  • Symbol定义的对象属性不能使用for...in 循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
// 创建一个Symbol
let s = Symbol()
console.log(s)

let s2 = Symbol('Tabjin')
let s3 = Symbol('Tabjin')
console.log(s2 === s3)// false

// Symbol.for 创建
let s4 = Symbol.for('Tabjin')
let s5 = Symbol.for('Tabjin')
console.log(s4, typeof s4)
onsole.log(s4 === s5)// true

// 不能与其他数据进行运算
let result = s + 100

USONB

undefined

string symbol

object

null number

boolean

2.对象添加symbol类型的属性

3.symbol的内置属性

9.迭代器

迭代器Iterator是一种接口,为不同的数据类型提供统一的访问机制。任何数据结构只要部署Iterator接口,既可以完成遍历操作。

  1. ES6创造了一种的新的遍历命令for...of循环,Iterator接口主要供for...of消费
  2. 原生具备Iterator接口的数据
    1. Array
    2. Arguments
    3. Set
    4. Map
    5. String
    6. TypedArray
    7. NodeList
  3. 工作原理
    1. 创建一个指针对象,指向当前数据结构的起始位置
    2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
    3. 接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧']
for(let v of xiyou) {
  console.log(v)// 输出的是键值
  // 唐僧
  // 孙悟空
  // 猪八戒
  // 沙僧
}

for(let v in xiyou) {
  console.log(v)// 输出的是键名
  // 0
  // 1
  // 2
  // 3
}

let iterator = xiyou[Symbol.iterator]()
// 调用对象的next方法
console.log(iterator.next())// {value: "唐僧", done: false}
console.log(iterator.next())// {value: "孙悟空", done: false}
console.log(iterator.next())// {value: "猪八戒", done: false}
console.log(iterator.next())// {value: "沙僧", done: false}
console.log(iterator.next())// {value: "undefined", done: true}

要自定义迭代数据的时候,要用迭代器

const xijun = {
  name: '西郡园小一班',
  students: [
    '超越',
    '添添',
    '二点',
    '小猪罗',
    'Tabjin',
    '老咻'
  ],
  [Symbol.iterator]() {
    //索引变量
    let index = 0
    let _this = this
    return {
      next: function() {
        if(index < this.students.length) {
        		const result = {value: this.students[i], done: false} 
            // 下标自增
            index++
          // 返回结果
          return result
        } else {
          return {value: undefined, done: true}
        }
      }
    }
  }
}

// 遍历这个对象
for(let v of xijun) {
    console.log(v)
  }

10.生成器函数

11.Promise介绍

ES6异步编程解决方案。Promise是一个构造函数,用来封装异步操作并可以获取其成功或者失败的结果。

  1. Promise构造函数Promise(excutor) {}
  2. Promise.prototype.then方法
  3. Promise.prototype.catch方法
// 实例化 Promise 对象
const p = new Promise(function(resolve, reject) {
	setTimeout(function() {
		// 
		let data = '数据库中的用户数据'
		// resolve
		resolve(data)
		
		let err = '数据读取失败'
		reject(err)
	}, 1000)
})

// 调用Promise对象的then方法
p.then(function(value) {
	console.log(value)
},function (reason) {
	console.err(reason)
})

1.Promise读取文件内容

// 1.引入 fs 模块
const fs = require('fs')

// 2.调用方法读取文件
fs.readFile('./resources/为学.md', (err, data) => {
  // 如果失败,则抛出错误
  if(err) throw err
  // 如果没有出错,则输出内容
  console.log(data.toString())
}) 
// 3.使用 Promise 封装
const p = new Promise(function(resolve, reject) {
   	fs.readFile('./resources/为学.md', (err, data) => {
    // 如果失败
    if(err) reject(err)
  	// 如果成功
  	resolve(data)
	}) 
})

p.then(function(value) {
  console.log(value.toString())
}, function(reason) {
  console.err('请求失败')
})

2.Promise封装Ajax请求

// 接口地址 https://api.apiopen.top/getJoke

// 1,创建对象
const xhr = new XMLHttpRequest()

// 初始化对象
xhr.open("GET", "https://api.apiopen.top/getJoke")

// 发送
xhr.send()

// 绑定事件,处理响应结果
xhr.onreadystatechange = function() {
  // 判断
  if(xhr.readyState === 4) {
    // 判断响应状态码 200-299
    if(xhr.status >= 200 && xhr.status < 300) {
      // 表示成功
      console.log(xhr.response)
    } else {
      // 失败
      console.log(xhr.status)
    }
  }
}
const p = new Promise((resolve, reject) => {
    // 接口地址 https://api.apiopen.top/getJoke

    // 1,创建对象
    const xhr = new XMLHttpRequest()

    // 初始化对象
    xhr.open("GET", "https://api.apiopen.top/getJoke")

    // 发送
    xhr.send()

    // 绑定事件,处理响应结果
    xhr.onreadystatechange = function() {
      // 判断
      if(xhr.readyState === 4) {
        // 判断响应状态码 200-299
        if(xhr.status >= 200 && xhr.status < 300) {
          // 表示成功
          resolve(xhr.response)
        } else {
          // 失败
          reject(xhr.status)
        }
      }
    }                  
})

p.then(function(value) {
  console.log(value)
}, function(reason) {
  console.error(reason)
})

3.Promise.prototype.then方法

const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('用户数据')
  },1000)
})

// 调用then方法,then方法的返回结果是 Promise 对象,对象的状态由回调函数的执行结果决定
// 1.如果回调函数中返回的结果是非promise类型的属性,状态为成功,返回值为对象的成功值
const result = p.then(value => {
  console.log(value)
  // 1.非 promise 类型的属性
  // return 123
  // 2.是 promise 对象
  return new Promise((resolve, reject)) => {
    // resolve('ok')
    reject('erro')
  }
  // 3.抛出错误
  throw new Error('出错啦')
},reason => {
  console.warn(reason)
})

console.log(result)// 这边是一个promise
image-20220314131956031

既然then方法是可以返回Promise对象,所以Promise是可以链式调用的,也解决的回调地狱问题。

p.then(value => {}, reason => {})
	.then(value => {}, reason => {})

4.Promise实践

// 引入 fs 模块
const fs = require('fs')

fs.readFile('./resources/为学.md', (err, data1) => {
  fs.readFile('./resources/插秧诗.md', (err, data2) => {
    fs.readFile('./resources/观书有感.md', (err, data3) => {
    	let result = data1 + '\r\n' + data2 + '\r\n' + data3
      console.log(result)
  	})
  })
}) 
// Promise 实现
const p = new Promise((resolve, reject) => {
  fs.readFile('./resources/为学.md', (err, data) => {
    resolve(data)
  }
})
  
p.then(value => {
  console.log(value.toString())
  return new Promise((resolve, reject) => {
    fs.readFile('./resources/观书有感.md', (err, data) => {
    	resolve([value, data])
    })
  }).then(value => {
    return new Promise((resolve, reject) => {
      fs.readFile('./resources/观书有感.md', (err, data) => {
        value.push(data)
        resolve(value)
      })
    })
  }).then(value => {
    console.log(value)
    console.log(value.join('\r\n'))
  })
})

5.Promise对象catch方法

const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    // 设置 p 对象的状态为失败,并设置失败的值
    reject('出错啦')
  }, 1000)
})

p.then(value => {
  
},reason => {
  console.log(reason)
})
posted @ 2022-03-14 17:48  Tabjin  阅读(31)  评论(0)    收藏  举报