- 习题
- 向量类型
- 分组
- 可迭代分组
习题
向量类型
编写一个构造器Vec
,在二维空间中表示数组。该函数接受两个数字参数x
和y
,并将其保存到对象的同名属性中。
向Vec
原型添加两个方法:plus
和minus
,它们接受另一个向量作为参数,分别返回两个向量(一个是this
,另一个是参数)的和向量与差向量。
向原型添加一个getter
属性length
,用于计算向量长度,即点(x,y)
与原点(0,0)
之间的距离。
// Your code here.
console.log(new Vec(1, 2).plus(new Vec(2, 3)));
// → Vec{x: 3, y: 5}
console.log(new Vec(1, 2).minus(new Vec(2, 3)));
// → Vec{x: -1, y: -1}
console.log(new Vec(3, 4).length);
// → 5
分组
标准的 JavaScript 环境提供了另一个名为Set
的数据结构。 像Map
的实例一样,集合包含一组值。 与Map
不同,它不会将其他值与这些值相关联 - 它只会跟踪哪些值是该集合的一部分。 一个值只能是一个集合的一部分 - 再次添加它没有任何作用。
写一个名为Group
的类(因为Set
已被占用)。 像Set
一样,它具有add
,delete
和has
方法。 它的构造器创建一个空的分组,add
给分组添加一个值(但仅当它不是成员时),delete
从组中删除它的参数(如果它是成员),has
返回一个布尔值,表明其参数是否为分组的成员。
使用===
运算符或类似于indexOf
的东西来确定两个值是否相同。
为该类提供一个静态的from
方法,该方法接受一个可迭代的对象作为参数,并创建一个分组,包含遍历它产生的所有值。
// Your code here.
class Group {
// Your code here.
}
let group = Group.from([10, 20]);
console.log(group.has(10));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
// → false
可迭代分组
使上一个练习中的Group
类可迭代。 如果你不清楚接口的确切形式,请参阅本章前面迭代器接口的章节。
如果你使用数组来表示分组的成员,则不要仅仅通过调用数组中的Symbol.iterator
方法来返回迭代器。 这会起作用,但它会破坏这个练习的目的。
如果分组被修改时,你的迭代器在迭代过程中出现奇怪的行为,那也没问题。
// Your code here (and the code from the previous exercise)
for (let value of Group.from(["a", "b", "c"])) {
console.log(value);
}
// → a
// → b
// → c