ES6
let const var
1. var 关键字
-
声明的全局变量挂载在window对象下
var a = 1; console.log(window.a) -
变量提升
console.log(a); var a = 1; -
声明的变量可以重复声明和修改
var a = 1; var a = '111'; console.log(a);
2. let 和 const 关键字
- let和const声明的全局变量不挂载在window对象下
- let 和 const 定义的变量不会出现变量提升现象,let/const 也存在变量声明提升,只是没有初始化分配内存。 一个变量有三个操作,声明(提到作用域顶部),初始化(赋默认值),赋值(继续赋值),其实就是创建提升,因为没有初始化分配内存,所以使用该变量就会报错,这是暂时性死区
- let 和 const 是JS中的块级作用域
- let 和 const 不允许重复声明(会抛出错误)
- const 声明一个只读的常量。一旦声明,常量的值就不能改变(如果声明是一个对象,那么不能改变的是对象的引用地址)
解构符号
1. 解构符号的作用
解构赋值是对赋值运算符的扩展,他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
2. 使用方式
-
基本使用
let [a, b, c] = [1, 2, 3]; // let a = 1,b = 2,c=3 -
嵌套使用
// 数组 let [a, [[b], c]] = [1, [[2], 3]]; console.log(a); console.log(b); console.log(c); // 对象 let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { y }] } = obj; console.log(x); console.log(y); -
忽略
// 数组 let [a, , b] = [1, 2, 3]; console.log(a); console.log(b); // 对象 let obj = { p: ['hello', { y: 'world' }] }; let { p: [x, { }] } = obj; console.log(x); -
不完全解构
// 数组 let [a = 1, b] = []; console.log(a); console.log(b); // 对象 let obj = { p: [{ y: 'world' }] }; let { p: [{ y }, x] } = obj; console.log(x); console.log(y); -
剩余运算符
// 数组 // let [a, ...b] = [1, 2, 3]; // console.log(a); // console.log(b); // 对象 let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; console.log(a); console.log(b); console.log(rest); -
字符串
let [a, b, c, d, e] = 'hello'; console.log(a); console.log(b); console.log(c); console.log(d); console.log(e); -
解构默认值
// 当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。 let [a = 2] = [undefined]; console.log(a); // 对象 let {a = 10, b = 5} = {a: 3}; // console.log(a); // console.log(b); -
交换变量的值.
let a = 1; let b = 2; [a,b] = [b,a]; console.log(a); console.log(b);
3. 解构赋值的应用
// 1. 浅克隆与合并
let name = { name: "aaa" }
let age = { age: 'bbb' }
let person = { ...name, ...age }
console.log(person) // { name: "aaa", age: 'bbb' }
let a = [1,2,3];
let b = [4,5];
let c = [...a,...b];
console.log(c);
// 2. 提取JSON数据
let JsonData = { id: 10, status: "OK", data: [111, 222] }
let { id, status, data: numbers } = JsonData;
console.log(id, status, numbers); //10 "OK" [111, 222]
// 3. 函数参数的定义
// 参数有序
function fun1([a, b, c]) { console.log(a, b, c) }
fun1([1, 2, 3]);
// 参数无序
function fun2({ x, y, z }) { console.log(x, y, z) }
fun2({ z: 3, x: 2, y: 1 });
// 参数有默认值
function fun3 ([a=1,b]) {
console.log(a,b);
}
fun3([,3])
箭头函数
1. 箭头函数没有this,this是从外部获取的
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
2. 箭头函数不能对箭头函数进行 new 操作
不具有 this 自然也就意味着另一个限制:箭头函数不能用作构造器(constructor)。不能用 new 调用它们。
var Foo = () => {};
var foo = new Foo(); // TypeError: Foo is not a constructor
3. 箭头函数没有arguments
箭头函数没有自己的 arguments 对象,但是箭头函数可以访问外围函数的 arguments 对象:
function constant() {
return () => arguments[0]
}
var result = constant(1);
console.log(result()); // 1
4. 箭头函数没有原型和super
连原型都没有,自然也不能通过 super 来访问原型的属性,所以箭头函数也是没有 super 的,不过跟 this、arguments、new.target 一样,这些值由外围最近一层非箭头函数决定。
var Foo = () => {};
console.log(Foo.prototype); // undefined
map与weakmap
1. map
1.1 map特点
-
Map的键和值可以是任何数据类型
//1. map的键名可以是任意数据 var map = new Map(); var o = {num:1}; map.set(o,'111'); console.log(map); -
键值对按照插入顺序排列
// map有顺序 var map = new Map([[2,'111'],[1,'222']]); console.log(map); // obj自动排序 var obj = {'2':'111','1':'222'} console.log(obj); -
map数据可迭代,object数据不可迭代
var map = new Map([[2,'111'],[1,'222']]); console.log(map); for(var value of map){ console.log(value) }
1.2 map的常用属性
| 操作方法 | 内容描述 |
|---|---|
| map.set(key,value) | 添加键值对到映射中 |
| map.get(key) | 获取映射中某一个键的对应值 |
| map.delete(key) | 将某一键值对移除映射 |
| map.clear() | 清空映射中所有键值对 |
| map.entries() | 返回一个以二元数组(键值对)作为元素的数组 |
| map.has(key) | 检查映射中是否包含某一键值对 |
| map.keys() | 返回一个当前映射中所有键作为元素的可迭代对象 |
| map.values() | 返回一个当前映射中所有值作为元素的可迭代对象 |
| map.size | 映射中键值对的数量 |
let map = new Map();
let o = {n: 1};
// 给map添加o属性,值是’A‘
map.set(o, "A");
// 给map添加'2'属性,值是9
map.set("2", 9);
// 判断是否存在’2‘属性
console.log(map.has("2"));
// 获取o属性值
console.log(map.get(o));
console.log(...map);
// 查看map
console.log(map);
// 删除’2‘属性
map.delete("2");
// 清空所有属性
map.clear();
//create a map from iterable object
let map_1 = new Map([[1, 2], [4, 5]]);
console.log(map_1.size); //number of keys
1.3 遍历map数据
keys():返回键名的遍历器values():返回键值的遍历器entries():返回键值对的遍历器forEach():使用回调函数遍历每个成员
const map = new Map([
['a', 1],
['b', 2],
])
for (let key of map.keys()) {
console.log(key)
}
// "a"
// "b"
for (let value of map.values()) {
console.log(value)
}
// 1
// 2
for (let item of map.entries()) {
console.log(item)
}
// ["a", 1]
// ["b", 2]
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value)
}
// "a" 1
// "b" 2
// for...of...遍历map等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value)
}
// "a" 1
// "b" 2
2. WeakMap
2.1 WeakMap特点
WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。
-
只接受对象作为键名(
null除外),不接受其他类型的值作为键名// 1. 只能使用对象作为键名 var weakmap = new WeakMap(); // weakmap.set('a',111); var o = {num:1}; weakmap.set(o,111); console.log(weakmap); -
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
// 2. 键名是弱引用,如果键名销毁,该属性就销毁 (IE打开) var weakmap = new WeakMap(); var o = {num:1}; weakmap.set(o,111); o = null; console.log(weakmap); -
不可枚举,枚举影响其列表将会受垃圾回收机制的影响,方法有
get、set、has、delete

浙公网安备 33010602011771号