1、声明变量的六种方法var、function、let、const、class、import
在ES5中,JavaScript是没有块级作用域的,如果在块内使用var声明一个变量,它在代码块外面仍旧是可见的。ES6规范给开发者带来了块级作用域,let和const都添加了块级作用域,使得JS更严谨和规范。
let 和var类似,let声明的变量,只在let命令所在的代码块内有效。
const 声明一个常量,变量指向的内存地址不得改动。简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量;引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
2、.Map()
Map和对象的区别:
- 一个 Object 的键只能是字符串或者 数字,但一个 Map 的键可以是任何数据类型(字符串、对象、函数、NaN)。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
Map 实例的属性和方法如下:
size:获取成员的数量
set:设置成员 key 和 value
get:获取成员属性值
has:判断成员是否存在
delete:删除成员
clear:清空所有
var map = new Map()
var obj = {name: 'test', age: 12}
map.set(obj, 'OK')
map.get(obj) // OK
map.has(obj) // true
map.delete(obj) // true
map.has(obj) // false
map.clear()
Map 实例的遍历方法有:
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回所有成员的遍历器
forEach():遍历 Map 的所有成员
var map = new Map()
map.set('sss', 100)
map.set('aaa', 200)
for (let key of map.keys) {
console.log(key)
}
// 100
// 200
// 将会显示两个 logs。 一个是 "sss = 100" 另一个是 "aaa = 200"
map.forEach(function(value, key) {
console.log(key + " = " + value);
}, map)
Map和Array转换
Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象。
使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组。
var kvArray = [["key1", "value1"], ["key2", "value2"]]
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
var myMap = new Map(kvArray) // {'key1' => 'value1', 'key2' => 'value2'}
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
var outArray = Array.from(myMap) // [["key1", "value1"], ["key2", "value2"]]
Map的克隆
Map 对象构造函数生成实例,迭代出新的对象。
var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]])
var myMap2 = new Map(myMap1)
console.log(myMap1 === myMap2 )
// 打印 false。 Map 对象构造函数生成实例,迭代出新的对象。
Map合并
合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的。
var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
var merged = new Map([...first, ...second]);
3、.Set()
set属性和方法
- 属性
Set.prototype
Set.prototype.size - 方法
Set.prototype.add()
Set.prototype.clear()
Set.prototype.delete()
Set.prototype.entries()
Set.prototype.forEach()
Set.prototype.has()
Set.prototype.values()
Set.prototype[@@iterator] ()
Set 中的特殊值
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
- +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复
- undefined 与 undefined 是恒等的,所以不重复
- NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复
数组去重
var mySet = new Set([1, 2, 3, 4, 4]);
[...mySet]; // [1, 2, 3, 4]
并集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4}
交集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([...a].filter(x => b.has(x))); // {2, 3}
差集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x))); // {1}
Set类型转换
Array和Set转换
// Array 转 Set
var mySet = new Set(["value1", "value2", "value3"]);
// 用...操作符,将 Set 转 Array
var myArray = [...mySet];
String 和 Set转换
// String 转 Set
var mySet = new Set('hello'); // Set(4) {"h", "e", "l", "o"}
// 注:Set 中 toString 方法是不能将 Set 转换成 String
// Set 转 String
var arr = [...mySet];
var str = arr.join(''); // 'helo' set有去重的特性,所以是helo
注:Set 中 toString 方法是不能将 Set 转换成 String
4、.iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
为什么加入iterable类型?
- 遍历array可以采用下标循环,遍历Map和Set无法使用下标。集合类型不统一。
- 对于array类型的for...in循环,当添加额外的属性后,会有意外效果。因此统一集合类型iterable中的 for...of循环
iterable 的 forEach方法
它接收一个函数,每次迭代就自动回调该函数
//Array
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element);
});
//Set
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
//Map
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});
5、for...of(迭代器)
for-in结构通常对 Array(数组)和Object(对象)都可以使用,而for-of结构在对Object(对象)使用时会报错。js 集合中能默认使用for of 有,数组,类数组,字符串,map,set。
for-in结构可以遍历 数组索引或对象键名,包括手动添加的键,甚至原型链上的键,而for-of在遍历值得时候无法遍历到手动添加的值或者通过原型添加的值。
- for of无法循环遍历对象
- for in 会遍历自定义属性,for of不会
6、箭头函数
原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。
(a,b) => {}
var fn = (a,b) => {}
当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。
箭头函数的函数体只有一个 return
语句时,可以省略 return
关键字和方法体的花括号。
箭头函数不绑定Arguments 对象
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。
在箭头函数出现之前,每一个新函数根据它是被如何调用的来定义这个函数的this值:
- 如果该函数是一个构造函数,this指针指向一个新的对象
- 在严格模式下的函数调用下,this指向undefined
- 如果该函数是一个对象的方法,则它的this指针指向这个对象
- 等等
7、Promise
8、.async函数
9、.keys,.values,.entries
ES6 提供三个新的方法 —— entries(),keys()和values()。 用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。