type
status
date
slug
summary
tags
category
icon
password

3.6 语句

for-in语句是一种严格的迭代语句,用于枚举对象中的非符号键属性,
start是一个标签,可以在后面通过break或continue语句引用。标签语句的典型应用场景是嵌套循环。
📝
label语法配合break或者continue,可在js中模拟出c语言中的goto语句的效果,不过也有大量的c开发者认为goto语句不应该被滥用。但在sveltejs中有一个典型的应用{let a = 1; $:console.log(a);++a}该语法实现了响应式的依赖收集,并且避免了闭包的产生

4.1 原始值与引用值

原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。

7.2 迭代器模式

迭代器模式(特别是在ECMAScript这个语境下)描述了一个方案,即可以把有些结构称为“可迭代对象”(iterable),因为它们实现了正式的Iterable接口,而且可以通过迭代器Iterator消费。
任何实现Iterable接口的数据结构都可以被实现Iterator接口的结构“消费”(consume)
这里通过创建迭代器并调用next()方法按顺序迭代了数组,直至不再产生新值。迭代器并不知道怎么从可迭代对象中取得下一个值,也不知道可迭代对象有多大。只要迭代器到达done: true状态,后续调用next(
迭代器维护着一个指向可迭代对象的引用,因此迭代器会阻止垃圾回收程序回收可迭代对象
“迭代器”的概念有时候容易模糊,因为它可以指通用的迭代,也可以指接口,还可以指正式的迭代器类型

7.3 生成器

生成器的形式是一个函数,函数名称前面加一个星号(*)表示它是一个生成器。只要是可以定义函数的地方,就可以定义生成器。
调用生成器函数会产生一个生成器对象。生成器对象一开始处于暂停执行(suspended)的状态。与迭代器相似,生成器对象也实现了Iterator接口,因此具有next()方法。调用这个方法会让生成器开始或恢复执行。
可以使用星号增强yield的行为,让它能够迭代一个可迭代对象,从而一次产出一个值
for-of循环调用了默认迭代器(它恰好又是一个生成器函数)并产生了一个生成器对象。这个生成器对象是可迭代的,所以完全可以在迭代中使用。

7.4 小结

迭代器必须通过连续调用next()方法才能连续取得值,这个方法返回一个IteratorObject。这个对象包含一个done属性和一个value属性。前者是一个布尔值,表示是否还有更多值可以访问;后者包含迭代器返回的当前值。这个接口可以通过手动反复调用next()方法来消费,也可以通过原生消费者,比如for-of循环来自动消费。

8.1 理解对象

属性分两种:数据属性和访问器属性。
合并对象提供了Object.assign()方法。这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举(Object.propertyIsEnumerable()返回true)和自有(Object.hasOwnProperty()返回true)属性复制到目标对象。
Object.assign()实际上对每个源对象执行的是浅复制。如果多个源对象都有相同的属性,则使用最后一个复制的值。此外,从源对象访问器属性取得的值,比如获取函数,会作为一个静态值赋给目标对象。换句话说,不能在两个对象间转移获取函数和设置函数。

8.2 创建对象

ES6的类都仅仅是封装了ES5.1构造函数加原型继承的语法糖而已。
重写整个原型会切断最初原型与构造函数的联系,但实例引用的仍然是最初的原型。记住,实例只有指向原型的指针,没有指向构造函数的指针。

8.3 继承

重温一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。
任何函数的默认原型都是一个Object的实例,这意味着这个实例有一个内部指针指向Object.prototype。这也是为什么自定义类型能够继承包括toString()、valueOf()在内的所有默认方法的原因。
[插图]
为了解决原型包含引用值导致的继承问题,一种叫作“盗用构造函数”(constructor stealing)的技术在开发社区流行起来(这种技术有时也称作“对象伪装”或“经典继承”)。
.3.3 组合继承组合继承(有时候也叫伪经典继承)综合了原型链和盗用构造函数,将两者的优点集中了起来。基本的思路是使用原型链继承原型上的属性和方法,而通过盗用构造函数继承实例属性
组合继承弥补了原型链和盗用构造函数的不足,是JavaScript中使用最多的继承模式。而且组合继承也保留了instanceof操作符和isPrototypeOf()方法识别合成对象的能力。
通过寄生式继承给对象添加函数会导致函数难以重用,与构造函数模式类似。

9.1 代理基础

使用代理的主要目的是可以定义捕获器(trap)
实际上,开发者并不需要手动重建原始行为,而是可以通过调用全局Reflect对象上(封装了原始行为)的同名方法来轻松重建。
 
 
rss源分享《哲学纲要》