解决原有语法上的一些不足
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会报错。
作用
-
使用Symbol作唯一值,防止命名冲突。
-
使用 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功能。