ES6浅记收纳盒

181 阅读6分钟

解决原有语法上的一些不足

let 和 const 及块级作用域

在{}中的作用域就是块级作用域

let

  • 块级作用域
  • 不存在声明提升(原因:暂时性死区)
  • 不能重复定义

const

  • const声明后必须赋值
  • const定义变量不能被更改,引用类型会被更改

let和const在全局作用域中声明的变量不会变成window对象上的变量

解构

对象解构

let obj = {a:1,b:undefined,c:{c1:3}}

let {a} = obj

let {a:aa} = obj//重命名

let {b=2} = obj//设置默认值,如果属性无值则使用默认值
let {b:bb=2} = obj//重命名并设置默认值

let {c:{c1}} = obj//嵌套解构

console.log(a,aa,b,bb,c1)

可以在函数传参时解构。

字符串解构

let message = 'Hello';
let [a, b] = message;

console.log(a, b);        // H e

数组解构

let numbers = [1, 2, 3];
let [x, y] = numbers;

console.log(x, y);    // 1 2 3

集合解构

let set = new Set().add('foo').add('bar');
let [a, b] = set;

console.log(a, b);// foo bar

映射解构

let map = new Map().set('a', 1).set('b', 2);
let [x, y] = map;

console.log(x, y);    // ["a", 1] ["b", 2]

解构的使用

  • 交换变量的值

  • 解构函数参数

  • 循环中的解构

  • 用于模块导入的按需加载

功能扩展

字符串的扩展

  • 模板字符串

  • 判断字符串中是否包含另外一个字符串的方法:

startsWith(字符串,开始索引)--判断目标字符串是否以传入的字符传【开头】

endsWith(字符串,结束索引)---判断目标字符串是否以传入的字符传【结束】

includes(字符串,开始索引)---判断目标字符串中是否【存在】传入的字符串

数值的扩展

  • 指数运算符**
  • 二进制(0b开头)和八进制(0o开头)字面量

函数的扩展

  • 函数参数默认值

  • 箭头函数

  • 展开运算符-接收不定参

  • new.target---使用new后,new.target引用被调用的构造函数

数组的扩展

  • 展开运算符-展开数组

  • Array.from()-将类数组结构转换为数组

  • Array.of()-将一组参数转换为数组

  • 数组迭代器:keys(),values(),entries()

  • 数组复制:copyWithin(填充开始位置,开始复制的位置-默认为0)

  • 数组填充:fill(填充元素,开始下标,结束下标)

  • 确定元素是否在数组上:includes(要检索的元素,开始下标)

对象的扩展

  • 属性值和方法名的简写,可计算属性

  • Object.values(obj)Object.entries(obj)

  • object.assign()-对象合并

  • object.is()-判断两个参数是否相对

  • class类

其他扩展

for of

导入导出

  • 导入improt
  • 导出export default

promise

迭代器与生成器

代理与反射

扩充的数据类型和数据结构

symbol

创建symbol

  • Symbol() 函数每次调用会创建一个新的唯一值

  • Symbol() 函数接受一个可选参数作为描述 let firstName = Symbol('first name'),

创建共享symbol

  • 使用Symbol.for()函数创建共享Symbol,Symbol.for() 会首先在全局中查找是否有已经创建的ssn的symbol,如果有就会返回已经创建的symbol,如果没有就会创建一个新的symbol。
let ssn = Symbol.for('ssn');

let nz = Symbol.for('ssn'); //如果有就会返回已经创建的symbol
console.log(ssn === nz); // true

Symbol当作构造函数来用 new会报错。

作用

  1. 使用Symbol作唯一值,防止命名冲突。

  2. 使用 symbol 作为对象属性

Map

映射

用来储存键值对的数据类型

基本使用

//创建
const map = new Map()

//增-使用set,如果Map中不存在则增加此项
//set方法返回Map实例,所以可以连缀使用
map.set('measure','36D').set('name','梅琳娜')

//删
map.delete('measure')

//改-使用set,如果Map中存在则修改此项
map.set('name','拉妮')

//查
console.log(map.get('name'))//查-存在-返回数据
console.log(map.has('name'))//使用has查找,如果存在则返回true

//返回map长度
console.log(map.size)//-1

//清空所有数据
map.clear()

console.log(map.get('name'))//查-不存在-返回undefined
console.log(map.has('name'))//使用has查找,如果不存在则返回false

Map可以使用任何数据类型作为键。

迭代

可以根据插入顺序执行迭代操作

let obj = {a:1,b:2,c:3}//一个对象

const map = new Map(Object.entries(obj))//将一个对象转为键值对数组后作为Map的初始数据

//直接输出
console.log(map)//Map(3) { 'a' => 1, 'b' => 2, 'c' => 3 }

//展开后输出
//因为entries是默认迭代器,所以直接使用扩展操作符,隐式的调用了entries()
console.log([...map])//[ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

console.log(map.keys())//[Map Iterator] { 'a', 'b', 'c' }
console.log(map.values())//[Map Iterator] { 1, 2, 3 }
console.log(map.entries())//[Map Entries] { [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] }

for(let key of map.keys()) console.log(key)// a b c
for(let key of map.values()) console.log(key)//1 2 3
for(let key of map.entries()) console.log(key)//[ 'a', 1 ] [ 'b', 2 ] [ 'c', 3 ]

//使用forEach遍历
map.forEach((val,index)=>console.log(index,val))
// a 1
// b 2
// c 3

Object与Map的对比

  • 内存占用:Map优于Object,Map能够储存更多的数据。

  • 数据插入:Map数据插入的效率较高。

  • 数据删除:Map删除数据的效率较高。

  • 在涉及大量查找操作时,选择Object。

WeakMap

弱映射

  • WeakMap内部的键是弱键,只要键存在,键值对就存在于映射中,并被当作对值的引用,只要键存在与外部的关系,就不会被当作垃圾回收。当键与外部的所有联系被打断后这个键值对就会被回收
//创建
const map = new WeakMap()

let measure = {value:'measure'}
let name = {value:'name'}

//增-使用set,如果Map中不存在则增加此项
//set方法返回WeakMap实例,所以可以连缀使用
map.set(measure,'36D').set(name,'梅琳娜')

//删
map.delete(measure)

//改-使用set,如果Map中存在则修改此项
map.set(name,'拉妮')

//查
console.log(map.get(name))//查-存在-返回数据
console.log(map.has(name))//使用has查找,如果存在则返回true,不存在返回false

WeakMap不可迭代,没有clear()和size功能。

Set

集合

基本使用

//创建
const set = new Set()

set.add('a').add('b')//增加,因为add()返回Set实例,所以可以连缀使用

set.delete('b')//删除一个

console.log(set.has('a'))//存在,返回true
console.log(set.has('b'))//不存在,返回false
console.log(set.size)//set大小,返回set长度

set.clear()//清除所有

Set可以包含任何数据类型作为值。

迭代

可以根据插入顺序执行迭代操作

//创建
let arr = ['a','b','c']

let set = new Set(arr)

console.log(set)//Set(3) { 'a', 'b', 'c' }

//效果相同
console.log(...set)//a b c
for(let value of set)console.log(value)//a b c
for(let value of set.keys())console.log(value)//a b c
for(let value of set.values())console.log(value)//a b c

set.forEach((val,index)=>console.log(index,val))
// a a
// b b
// c c

WeakSet

弱集合

  • WeakMap内部的值是弱值,只要值存在,值就存在于映射中,只要值存在与外部的关系,就不会被当作垃圾回收。当值与外部的所有联系被打断后这个值就会被回收

WeakSet不可迭代,没有clear()和size功能。