# 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())取得这个迭代器:

Last Updated: 3/5/2021, 2:34:59 PM