以下内容若有问题烦请即时告知我予以修改,以免误导更多人。
- 数据类型
- Symbol
- 数据结构
- Map
- WeakMap
- Set
- WeakSet
- Map
- 声明变量
- let
- let声明的变量只在当前代码块内有效
- for循环变量为副作用域,循环内部为子作用域,let范围不冲突不交叉
- 字符串遍历器
- 不存在变量提升
- 暂时性死区
- 不允许重复声明
- const
- 应用场景
- ES5 & ES6 声明变量
- 顶层对象 & 全局变量
- global对象
- 顶层对象
- this变量
- 引入global作为顶层对象
- let
- destructuring 解构赋值
- 数组的解构赋值
- 默认值
- 对象的解构赋值
- 应用
- class类
- arrow function 箭头函数
- `` template string 模版字符串
- Spread 扩展运算符 …
- default reset
- default
- reset
- default
- import export
- es5
- es6
- proxy & reflect
- Proxy
- Reflect
- Promise
- for…of循环
数据类型
Symbol
- 独一无二的值
1 | let a1 = Symbol(); |
数据结构
Map
键值对集合,键的范围不限于字符串
map.size
map.has('xxx')
map.get('xxx')
map.set(arr, 'xxx')
map.delete('xxx')
map.clear()
1 | const map = new Map([ |
WeakMap
WeakMap只接受对象作为键名
没有clear方法
Set
- 类似数组,但是成员的值都是唯一的,没有重复的值。
1 | let arr1 = [1, 2, 3 ,1]; |
list.size
list.add(xxx)
添加值,返回Set解构本身list.delete(xxx)
删除值,返回是否删除成功的booleanlist.has(xxx)
该值是否为Set的成员,返回一个booleanlist.clear()
清除所有成员,没有返回值
- 遍历
1 | let arr = ['add', 'delete', 'clear']; |
WeakSet
WeakSet成员只能是对象
没有clear方法
声明变量
let
let & var
let声明的变量只在当前代码块内有效
1 | { |
- eg: 可用于for循环计数
1 | var a = []; |
1 | var a = []; |
for循环变量为副作用域,循环内部为子作用域,let范围不冲突不交叉
1 | for(let i = 0; i < 3; i++) { |
字符串遍历器
1 | let str = 'abc'; |
不存在变量提升
1 | console.log(foo); // undefined |
暂时性死区
1 | var tmp = 123; |
let绑定了if语句的块级作用域
1 | var x = x; // 不报错 |
不允许重复声明
1 | // 报错 |
1 | function func(arg) { |
函数声明
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
1 | // *浏览器的 ES6 环境 |
优化 => 推荐函数表达式
1 | // 函数声明语句 |
const
声明常量
只在声明所在的块级作用域内有效
const并不是变量的值不得改动,而且是变量指向的内存地址不得改动。
简单类型的数据(数值、字符串、布尔值) => 常量
复合类型的数据(对象、数组等) => 指针地址
1 | const foo = {}; |
应用场景
引用第三方库的时声明的变量,用const来声明可以避免未来不小心重命名而导致出现bug。
1 | const monent = require('moment'); |
ES5 & ES6 声明变量
ES5:
var
function
ES6:
var
function
let
const
import
class
顶层对象 & 全局变量
var命令和function命令声明的全局变量,依旧是顶层对象的属性
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
1 | var a = 1; |
global对象
顶层对象
浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。
Node 里面,顶层对象是global,但其他环境都不支持。
this变量
全局环境中,this会返回顶层对象。但是,Node 模块和 ES6 模块中,this返回的是当前模块。
函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined。
不管是严格模式,还是普通模式,new Function(‘return this’)(),总是会返回全局对象。但是,如果浏览器用了 CSP(Content Security Policy,内容安全政策),那么eval、new Function这些方法都可能无法使用。
引入global作为顶层对象
- 方法一
1 | (typeof window !== 'undefined' |
- 方法二
1 | var getGlobal = function () { |
destructuring 解构赋值
从数组和对象中提取值,对变量进行赋值。
数组的解构赋值
1 | let [a, b, c] = [1, 2, 3]; |
默认值
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
1 | let [x, y = 'b'] = ['a', undefined]; // x='a', y='b' |
对象的解构赋值
对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
1 | let { bar, foo } = { foo: "aaa", bar: "bbb" }; |
解构赋值的内部机制:先找到同名属性,然后再赋给对应的变量。真正被赋值的是baz而不是foo。
1 | // es5 |
应用
- 变量交换
1 | { |
class类
extends
super()
1 | class Animal { |
arrow function 箭头函数
1 | // es5 |
- 数组应用
1 | let arr = [ 5, 6, 7, 8, 'a' ]; |
- 处理this
原理:箭头函数没有自己的this,他的this是继承外面的,因此内部的this就是外层代码块的this。
1 | class Animal { |
`` template string 模版字符串
` (反引号)模版字符串 包裹字符串及变量
${xxx}
引用变量
1 | var fName = 'Peter', sName = 'Smith', age = 43, job = 'photographer'; |
Spread 扩展运算符 …
- 将多个参数合并到一个数组中
1 | console.log(...[1,2,3]); // 1 2 3 |
- 将数组或对象分散到新的数组或对象中
1 | let a = [1, 2, 3]; |
default reset
default
1 | // es5 |
reset
...变量名
获取函数的多余参数参数变量是一个数组,该变量将多余的参数放入数组中
1 | function animals(...types) { |
import export
es5
- 服务器端 CommonJS
- 浏览器端 AMD(eg:require.js)
es6
- module功能
es5
- require.js
1 | // content.js |
- CommonJS
1 | // index.js |
es6
1 | // index.js |
proxy & reflect
Proxy
1 | let obj = { |
Reflect
不管Proxy怎么修改默认行为,总可以在Reflect上获取默认行为。
1 | let obj = { |
Promise
1 | console.log(typeof Promise); //"function" |
异步编程解决方案
三种状态
- Pending(进行中)
- Fulfilled(已成功)
- Rejected(已失败)
Resolved(已定型)
- Pending -> Fulfilled
- Pending -> Rejected
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve(必写)和reject(可选)
- resolve (Pending -> Resolved) 未完成->成功
- reject (Pending -> Rejected) 未完成->失败
Promise实例生成以后,可以用then方法分别指定Resolved状态和Rejected状态的回调函数。
1 | // ES5回调函数 |
- promise用法
1 | promise.then(function(value) { |
- promise对象回调处理详解
1 | console.log('我是顺序运行的1号'); |
for…of循环
1 | let a = ['a', 'b', 'c', 'd']; |
更多内容可以订阅本人微信公众号,一起开启前端小白进阶的世界!