# 2021-03
# 箭头函数
- 如果只有一个参数,可以不适用括号。只有没有参数,或者多个参数的情况下,才需要括号
- 省略大括号会隐式返回这行代码的值
# 函数名
- 函数名是指向函数的指针,所以它们跟其它包含对象指针的变量具有相同的行为。这意味着一个函数可以有多个名称。
function sum(a, b) {
return a+ b;
}
console.log(sum(10,10)); // 20
// 注意,使用不带括号的函数名会访问函数指针,而且不会执行函数
let anotherSum = sum;
console.log(anotherSum(10,10)); // 20
// 设置sum为null切断它与函数之间的关联,不影响anotherSum
sum = null;
console.log(anotherSum(10,10))// 20
# 代理与反射
代理是使用proxy构造函数创建的。
const target = {
id: 'target'
}
const handle = {}
const proxy = new Proxy(target, handle)
//id属性会访问同一个值
//给目标属性赋值会反映在两个对象上
//因为俩对象访问的是同一个值
target.id = 'foo'
//给代理属性数值会反映在两个对象上
//因为这个赋值会转移到目标对象
proxy.id = 'bar'
console.log(target.id)
console.log(proxy.id)
//hasOwnPrototype()方法在两地方都会应用到目标对象
console.log(target.hasOwnProperty('id'))
console.log(proxy.hasOwnProperty('id'))
//Proxy.prototype是undefined,因此不能适用instanceof操作符
//严格相等可以用来区分代理和目标
console.log(target === proxy)// false
使用代理的主要目的是可以定义捕获器(trap)
# 迭代器模式
迭代器模式描述了一个方案,即可以把有些结构称为“可迭代对象”(iterable),因为它们实现了正式的Iterable接口
可迭代对象是一种抽象说法。基本上,可以把可迭代对象理解成数组或集合这样的集合类型的对象。它们的元素都是有限的,而且都具有无歧义的遍历顺序:
// 数组的元素是有限的
// 递增索引可以按序访问每个元素
let arr = [2,3,1]
//集合的元素是有限的
//可以按插入顺序访问每个元素
let set = new Set().add(2).add(3).add(1);
# 生成器
生成器的形式是一个函数,函数名称前面加一个星号(*)表示它是一个生成器。
//生成器函数声明
function* f() {}
//生成器函数表达式
let generatorFn = function* () {}
//作为对象字面量方法的生成器函数
let foo = {
* generatorFn(){}
}
//作为类实例方法的生成器函数
class Foo{
* generatorFn() {}
}
//作为静态类方法的生成器
class Bar{
* generatorFn() {}
}
🚩箭头函数不能用来定义生成器函数
# Map
- Map是一种新的集合类型
//使用自定义迭代器初始化映射
const m = new Map({
[Symbol.iterator]:function *() {
yield ["key1", "val1"];
yield ["key2", "val2"];
yield ["key3", "val0"];
}
})
console.log(m)
console.log(m.size)
console.log(m.get("key3"))
//映射期待的键/值,无论是否提供
const m2 = new Map([[]])
console.log(m2)
console.log(m2.has(undefined))
console.log(m2.get("undefined"))
//set()方法返回映射实例,因此可以把多个操作链接起来,包括初始化声明
m2.set("hhy","ganed").set("hag", "shima")
m2.delete(undefined)
//m2.clear() // 清除这个映射实例中的所有键/值
console.log(m2)
console.log(m2.size)
# 顺序与迭代
与object类型的一个主要差异是,Map实例会维护键值对的插入顺序,因此可以根据插入顺序执行迭代操作。
映射实例可以提供一个迭代器(Iterator),能以插入顺序生成[key, value]形式的数组。可以通过entries()方法(或者Symbol.iterator属性,它引用entries())取得这个迭代器: