Aiden's blog Aiden's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • JavaScript教程
    • JavaScript高级程序设计
    • ES6 教程
    • Vue
    • Vue3.0
    • React
    • TypeScript 从零实现 axios
    • Git
    • TypeScript
    • JS设计模式总结
    • 小程序
    • 小程序云开发
    • Echarts
    • 微前端
    • H5
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 搜索引擎
  • ES系列
  • 经典面试题
  • 知识点总结
  • uni-app
  • 算法
  • Vue3实战
  • 小程序chatgpt
  • 小程序配网流程
  • 程序WIFI配网
  • 小程序WebSocket
  • H5 WebSocket
  • H5 TTS
  • Vue3实现OSS存储
  • 大文件分片上传
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Aiden Wu

前端界的小学生
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • JavaScript教程
    • JavaScript高级程序设计
    • ES6 教程
    • Vue
    • Vue3.0
    • React
    • TypeScript 从零实现 axios
    • Git
    • TypeScript
    • JS设计模式总结
    • 小程序
    • 小程序云开发
    • Echarts
    • 微前端
    • H5
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 搜索引擎
  • ES系列
  • 经典面试题
  • 知识点总结
  • uni-app
  • 算法
  • Vue3实战
  • 小程序chatgpt
  • 小程序配网流程
  • 程序WIFI配网
  • 小程序WebSocket
  • H5 WebSocket
  • H5 TTS
  • Vue3实现OSS存储
  • 大文件分片上传
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • 搜索引擎

  • ES系列

    • ES6
      • 严格模式
      • let声明变量
      • const声明常量
      • 属性的增强
      • Symbol数据类型
      • 箭头函数
      • 字符串模板
      • 数组解构
      • 对象解构
      • 数组扩展
      • 数组方法扩展
      • find
      • findIndex
      • 对象的扩展
      • 克隆
      • Set
      • Map
      • for循环
      • promise封装请求
      • 函数
      • 解构赋值
      • 数值扩展
      • 对象的扩展
      • 数组结构
      • 字符串
      • 面向对象
      • json
      • Promise
      • Promise.finally
      • generator生成器函数
      • Interator
      • Reflect
      • 链式编程
      • 模块化实现
    • ES7
    • ES8
    • ES9
    • ES10
    • ES11
    • ES12
  • 经典面试题

  • 知识点总结

  • uni-app

  • 算法

  • Vue3实战

  • 小程序chatgpt

  • 小程序WIFI配网

  • 小程序配网流程

  • 小程序WebSocket

  • H5 WebSocket

  • H5 TTS

  • Vue3实现OSS存储

  • 大文件分片上传

  • 技术
  • ES系列
wushengxin
2021-09-30
目录

ES6

# ES6

JavaScript 的正式名称是 ECMAScript 。1996年11月,JavaScript 的创造者网景公司将 JS 提交给国际化标准组织 ECMA(European computer manufactures association,欧洲计算机制造联合会),希望这种语言能够成为国际标准,随后 ECMA 发布了规定浏览器脚本语言的标准,即 ECMAScript。这也有利于这门语言的开放和中立。

成为更好编写的开发语言有以下目标。

适应更复杂的应用;实现代码库之间的共享;不断迭代维护新版本。

js后面可以不加分号

当{【+-/五个符号之一时,前面加分号

# 严格模式

  • IE10以上有作用
  • 为某个函数开启严格模式,函数内部加入“use strict”
  • 我们的变量名必须先声明后使用
  • 我们不能随意删除已经声明好的变量
  • 严格模式下全局作用域中函数的this是undefined
  • 在严格模式下,如果构造函数不加new调用,this会报错
  • new实例化的构造函数指向创建的对象实例
  • 定时器this还是指向window
  • 事件和对象还是指向调用者
  • 函数的变化
    • 不允许函数里面的参数有重名
    • 不允许非函数代码块里声明函数,必须放在最外层声明

image-20210103220552647 image-20210104130515586 image-20210104130724940

# let声明变量

mutable

  • var 可以声明多次,var可以重复声明,无法限制修改,没有块级作用域,有局部作用域(函数作用域)和全局作用域
  • var只有在function(函数)中有块级作用域,在if、for中没有块级作用域
  • 全局变量:只有浏览器关闭的时候才会销毁,比较占内存资源
  • 局部变量:当我们程序执行完毕就会销毁
function fn() {
   //var a
    if (true) {
        console.log(a + ' now')
    }
    else {
        var a = 1
        console.log(2)
    }
}
1
2
3
4
5
6
7
8
9
10
  • let 只能声明一次,可赋值不同的数据类型
  • let 声明的变量只在 let 命令所在的代码块内有效
  • let具有暂时性死去特性
  • ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

注意:函数作用域:只有函数有,如果在函数内部没有声明,直接赋值的变量为全局变量

  • image-20200728091329631
let [a, b, c] = [1, 2, 3];
1

# const声明常量

首选cosnt原因:符合JavaScript函数式编程的思想,定义完一个变量后,变量是不可变的(immutable),减少变量更改赋值的机会,减少负作用

  • const 声明一个只读的常量,一旦声明,常量的值就不能改变
  • const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错,对象时可以改变内部的属性

image-20200808142234334

  • 复杂数据类型,如array,object可以修改
    • ary[0]没错
    • ary = [1,2]重新赋值就错了

image-20210105171256673

# 属性的增强

属性的增强写法,属性名和值相同时

直接写一个key即可

# Symbol数据类型

  • ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol
  • Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名
  • 不能与其他数据进行计算,包括同字符串拼串
  • for in,for of遍历时不会遍历symbol属性

image-20201214165047848

image-20201214220242367

# 箭头函数

  • 箭头函数中的this指向函数定义位置的上下文的this,此时的this指向obj

image-20210105195808250

image-20200728091426763

image-20200728091726517

  • 箭头函数里面没有this,所以指向最外层,当前对象

  • 箭头函数的this指向父函数的this指向,即最近一层的this

  • 对象里面的函数fun(){}和fun:function(){}一个意思

  • image-20200721095728875

  • image-20200721095400327

  • image-20200728091655906

  • let show=function(a){
    	return a=a*2;
    }
    let show=a=>a*2;
    
    1
    2
    3
    4

经典面试题

  • 箭头函数会改变this的指向,obj不能产生作用域,所以此时的this指向window

image-20210105195342940

# 字符串模板

··包起来,$加变量名

image-20200721094717841

# 数组解构

image-20200721094908098

# 对象解构

image-20200721095018862

# 数组扩展

image-20201217143001527

image-20201217143010541

# 数组方法扩展

  • Array.from(v)伪数组转换为真数组

image-20201217143212593

image-20201217143519603

# find

image-20210105174630489

# findIndex

找到了返回索引值,没找到返回-1

image-20210105174704513

# 对象的扩展

  • NaN与任何值都不相等
  • Object.js(v1,v2)是通过字符串的方式去比较相等,下面的为false true
  • Object.assign,target为目标对象

image-20201217143609814

image-20201217144800578

image-20201217145106344

image-20201217145430378

# 克隆

  • 基本数据类型拷贝后修改不会生产新的数据
  • 只有对象和数组才会有影响,最后打印的结果为wade和abcd
  • 浅拷贝(对象/数组)拷贝的是引用,修改会影响原数据
  • 深拷贝,拷贝的是新数据,修改不会影响原数据
  • 浅拷贝只拷贝一层,更深层次对象级别的只拷贝引用
  • 深拷贝拷贝多层,每一级别的数据都会拷贝
  • 扩展运算符第一层是深拷贝,后面的都是浅拷贝

image-20201217145940168

image-20201217150115497

image-20201217150815592

image-20201217151052793

浅拷贝语法糖

  • 第一个参数为拷贝的对象
  • 第二个参数为被拷贝的对象
  • 扩展运算符...:针对一维数组和对象是深拷贝,多维的是浅拷贝

image-20210104211447822

# Set

  • Set数据结构,Set本身是一个构造函数
  • 用于搜索历史关键字,数组去重
  • 无序不可重复的多个value的集合体(数组)
  • new一个Set,放一个数组,数组的每一项值不能相同,即set会自动去重
  • set类型通过扩展运算符(...)将他转变为数组,[...new Set(arr)]
    • add、delete、clear、has、size、for of

image-20201217152437495

image-20201217152520055

image-20201217151928759

Set`的不重复性中,要注意`引用数据类型和NaN
// 两个对象都是不用的指针,所以没法去重
const set1 = new Set([1, {name: '林三心'}, 2, {name: '林三心'}])
console.log(set1) // Set(4) { 1, { name: '林三心' }, 2, { name: '林三心' } }


// 如果是两个对象是同一指针,则能去重
const obj = {name: '林三心'}
const set2 = new Set([1, obj, 2, obj])
console.log(set2) // Set(3) { 1, { name: '林三心' }, 2 }

咱们都知道 NaN !== NaN,NaN是自身不等于自身的,但是在Set中他还是会被去重
const set = new Set([1, NaN, 1, NaN])
console.log(set) // Set(2) { 1, NaN }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Map

  • 无序的key不重复的多个key-value的集合体
  • set、get、size、clear、delete、for of、has

image-20201217152554880

image-20201217153046736

image-20210409194035622

# for循环

forEach遍历

image-20200721100004465

image-20200721100101877

map遍历

image-20200721100152891

连接数组:...是展开字符,将数组展开运算

image-20200721100424766

# promise封装请求

image-20200721163923188

调用

image-20200721163941986

image-20200721164036961

# 函数

  • 参数扩展/展开数组

  • 默认参数,传了参数就是传参的值,不传就为默认参数

  • b默认为5,c默认为12

    image-20200728092855855

# 解构赋值

  • 左右两边结构必须一样

  • 右边必须是个东西

  • 声明和赋值不能分开(初始化),必须在一句话里完成

let [a,b,c]=[1,2,3];
let {a,c,d}={a:12,c:5,d:6};
let [{a,b},[n1,n2,n3],num,str]=[{a:12,b:5},[12,5,8],8,'abc'];
1
2
3
  • {data:res}相当于data为res ,data=res

# 数值扩展

  • Number.EPSILON

image-20210807231339257

  • 二进制、八进制、十六进制:0b1010、0o777、0xff

  • Number.isFinite:检测一个数值是否为有限数

  • Number.isNaN:检测一个数是否为NaN

  • Number.parseInt、Number.parseFlout

  • Number.isInteger:判断一个数是否为整数

  • Math.trunc:将数字的小数部分抹掉

  • Math.sign:判断一个数到底为正数、负数、零,返回(1,-1,0)

# 对象的扩展

  • Object.is:判断两个值是否完全相等(===),除了NaN === NaN为false
  • Object.assign:对象的合并,后面的参数覆盖前面的
  • Object.setPrototypeOf:设置原型对象(改变原型对象)
    • Object.setPrototypeOf(a1,b1):a1原型对象为b1
  • Object.getPrototypeOf:获取一个对象的原型对象

# 数组结构

  • map 映射,用于总体的加减乘除

image-20200728093809311

image-20200728093851642

  • reduce 汇总

    • tmp是中间体,即算数的中间体,初始为12
    • item为69
    • index为1,即指向开始的item
    • 第二个形式参数为初始值

    image-20200728094140140

    • 函数后面的0为preValue的初始值,preValue为前面n的值

    image-20200811160820604

  • filter 过滤器

    • 用于找到合适的数,相当于if
    • 返回的是bool值,返回为true的放到新的数组中
  • image-20200728094328562

    • image-20200728094359776
  • forEach 循环(迭代)

    • image-20200728094507541

# 字符串

  • 模板字符串${变量名}
  • 模板字符串也可以调用函数

image-20210105175044730

  • starsWith方法,返回Boolean
    • image-20200728094704893
  • endsWith方法,返回Boolean
    • image-20200728094731325
  • repeat重复指定次数,ababababab

image-20201217142644368

  • 字符串模板
    • 字符串连接
      • 直接把东西塞到字符串里面$(变量)
      • 可以折行
    • image-20200728094813851

# 面向对象

  • class关键词,class里面直接加方法

  • constructor构造器,构造器和类分开了

  • 继承:

    • extends名字
    • 超类/父类super()继承方法

image-20200728095105721

image-20200728095357252

# json

  • json的标准写法
  1. 只能用双引号
  2. 所有的名字必须用引号包起来(key)
  • JSON.stringify(变量)字符串化

image-20200728095649109

  • 字符串转json对象,JOSN.parse(变量名)

image-20200728100113002

  • 简写
    • 名字和值一样时只写一个

  • json对象里面的函数fun(){}和fun:function(){}一个意思,不用:function了

    image-20200728100555655

# Promise

  • 异步:操作之间没啥关系,同时进行多个操作,代码更复杂

  • 同步:同时只能做一件事,代码简单

  • 步骤

单独的文件用来封装请求

image-20200730153315535

相应的js页面引入

image-20200730153359167

调用

image-20200730153430715

# Promise.finally

新增的Promise方法,无论失败或者成功状态,都会执行这个函数

// cheng
new Promise((resolve, reject) => {
  resolve('成功喽')
}).then(
  res => { console.log(res) },
  err => { console.log(err) }
).finally(() => { console.log('我是finally') })
1
2
3
4
5
6
7

# generator生成器函数

与promise一样解决异步编程

返回一个指针对象(遍历器对象)interator

不能写成箭头函数

要依赖于runner

用来函数暂停

*来声明,写哪里都可以

yield来控制函数的执行位置

next来调用函数哪部分的位置

调用一次next,执行a,调用两次,执行a,b

image-20200730175806918

yield传参,下面的值为5,第一个next没法传参

image-20201213220739126

yield返回,12为第一个res1的值,return出去的值给res2

image-20201213221701725

image-20201213222905321

异步操作

  • promise一次读一堆
  • generator适用于逻辑性

image-20201213224020626

image-20201214125347087

# Interator

(迭代器),是一种接口机制,为各种不同的数据结构提供统一的访问机制

  • 是一个指针对象,遍历器对象,内部有一个next方法

  • 为各种数据结构,提供一个统一的、简便的访问接口

  • 使得数据结构的成员能够按某种次序排序

  • ES6创造一种新的遍历命令for of循环,Interator接口主要供for of 消费

image-20201214221459609

image-20201214222757241

  • 对象不能用for of遍历,因为没有interator
  • 使用三点运算符合,解构赋值,调用到了interator接口
  • 对象的Symbol.interator属性,指向遍历器对象

image-20201217134916148

# Reflect

Reflect对象是一个全局的普通的对象。Reflect的原型就是Object

Reflect是ES6为了操作对象而新增的API, 为什么要添加Reflect对象呢?它这样设计的目的是为了什么?

1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上,那么以后我们就可以从Reflect对象上可以拿到语言内部的方法。

2)在使用对象的 Object.defineProperty(obj, name, {})时,如果出现异常的话,会抛出一个错误,需要使用try catch去捕获,但是使用 Reflect.defineProperty(obj, name, desc) 则会返回false。

  • 读数据Reflect.get(obj,'a') obj为对象,a为属性
  • 修改数据Reflect.get(obj,'a',100) obj为对象,a为属性
  • 删数据Reflect.deleteProperty(obj,'a',100) obj为对象,a为属性

# 链式编程

多个函数之间的套用

image-20200811161127244

image-20200811161335611

# 模块化实现

每个js文件都是模块化,是一个独立的空间,script中加type="module"

image-20200813162732778

image-20200813142106383

导出方式一:

export{
	flag,sum
}
1
2
3

导出方式二:

export var num1 = 1000;
export var height = 1.88;
1
2

导出方式三:导出函数/类

export function mul(num1,num2){
	return num1 * num2
}

export class Person{
    run(){
        consloe.log("在奔跑");
    }
}
1
2
3
4
5
6
7
8
9

导出方式四:export default只能导出一个(自定义导出)

export default address
1

导入方式一:

import {flag,sum} from "./aaa.js";
if(flag){
	console.log("小明是天才,嘿嘿嘿");
}
1
2
3
4

导入方式二:

import {num1,height} from "./aaa.js";
console.log(num1);
console.log(height);
1
2
3

导入方式三:

import {mul} from "./aaa.js";
console.log(mul(30,50));

const p = new Person();
p.run()
1
2
3
4
5

导入方法四:自定义导入,变量命名随意

import addr from "./aaa.js";
1

统一全部导入

import * as aaa from './aaa.js';
console.log(aaa.flag);
1
2
编辑 (opens new window)
上次更新: 2021/12/06, 21:28:32
如何在Google搜索到我的网站?
ES7

← 如何在Google搜索到我的网站? ES7→

最近更新
01
大文件分片上传
08-05
02
Vue3实现OSS存储
08-05
03
H5 TTS
08-05
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Aiden Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×