Skip to content

Commit 0407687

Browse files
committed
update: --
1 parent 49dbfee commit 0407687

File tree

7 files changed

+601
-1
lines changed

7 files changed

+601
-1
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ https://github.com/webVueBlog/Leetcode
1313

1414
欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star (此仓库每天都会准时更新)
1515

16-
## 🦂 阶段十五(395
16+
## 🦐 阶段十五(401
1717

1818
<details open>
1919
<summary>展开查看</summary>
@@ -29,6 +29,13 @@ https://github.com/webVueBlog/Leetcode
2929
- 393.[DataView](./阶段十五/DataView.js)
3030
- 394.[ArrayBuffer 视图](./阶段十五/视图.js)
3131
- 395.[迭代与扩展操作](./阶段十五/迭代与扩展操作.js)
32+
- 396.[Map](./阶段十五/Map.js)
33+
- 397.[WeakMap](./阶段十五/WeakMap.js)
34+
- 398.[Set](./阶段十五/Set.js)
35+
- 399.[WeakSet](./阶段十五/WeakSet.js)
36+
- 400.[Map顺序与迭代](./阶段十五/Map顺序与迭代.js)
37+
- 401.[选择 Object 还是 Map](./阶段十五/选择.js)
38+
3239

3340
</details>
3441

阶段十五/Map.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/**
2+
作为 ECMAScript 6 的新增特性,Map 是一种新的集合类型
3+
4+
使用 new 关键字和 Map 构造函数可以创建一个空映射:
5+
const m = new Map();
6+
7+
可以给 Map 构造函数传入一个可迭代对象,需要包含键/值对数组。
8+
9+
// 使用嵌套数组初始化映射
10+
const m1 = new Map([
11+
["key1", "val1"],
12+
["key2", "val2"],
13+
["key3", "val3"]
14+
]);
15+
alert(m1.size); // 3
16+
17+
18+
// 使用自定义迭代器初始化映射
19+
const m2 = new Map({
20+
[Symbol.iterator]: function*() {
21+
yield ["key1", "val1"];
22+
yield ["key2", "val2"];
23+
yield ["key3", "val3"];
24+
}
25+
});
26+
alert(m2.size); // 3
27+
28+
29+
// 映射期待的键/值对,无论是否提供
30+
const m3 = new Map([[]]);
31+
alert(m3.has(undefined)); // true
32+
alert(m3.get(undefined)); // undefined
33+
34+
35+
可以使用 set()方法再添加键/值对
36+
37+
get()和 has()进行查询
38+
39+
可以使用 delete()和 clear()删除值
40+
41+
const m = new Map();
42+
43+
alert(m.has("firstName")); // false
44+
alert(m.get("firstName")); // undefined
45+
alert(m.size); // 0
46+
47+
m.set("firstName", "Matt")
48+
.set("lastName", "Frisbie");
49+
50+
alert(m.has("firstName")); // true
51+
alert(m.get("firstName")); // Matt
52+
alert(m.size); // 2
53+
54+
m.delete("firstName"); // 只删除这一个键/值对
55+
56+
alert(m.has("firstName")); // false
57+
alert(m.has("lastName")); // true
58+
alert(m.size); // 1
59+
60+
m.clear(); // 清除这个映射实例中的所有键/值对
61+
62+
alert(m.has("firstName")); // false
63+
alert(m.has("lastName")); // false
64+
alert(m.size); // 0
65+
66+
67+
*/
68+
69+
// Object 只能使用数值、字符串或符号作为键
70+
71+
/**
72+
73+
const m = new Map();
74+
75+
const functionKey = function() {};
76+
const symbolKey = Symbol();
77+
const objectKey = new Object();
78+
79+
m.set(functionKey, "functionValue");
80+
m.set(symbolKey, "symbolValue");
81+
m.set(objectKey, "objectValue");
82+
83+
alert(m.get(functionKey)); // functionValue
84+
alert(m.get(symbolKey)); // symbolValue
85+
alert(m.get(objectKey)); // objectValue
86+
87+
// SameValueZero 比较意味着独立实例不冲突
88+
alert(m.get(function() {})); // undefined
89+
90+
91+
92+
93+
const m = new Map();
94+
95+
const objKey = {},
96+
objVal = {},
97+
arrKey = [],
98+
arrVal = [];
99+
100+
m.set(objKey, objVal);
101+
m.set(arrKey, arrVal);
102+
103+
objKey.foo = "foo";
104+
objVal.bar = "bar";
105+
arrKey.push("foo");
106+
arrVal.push("bar");
107+
108+
console.log(m.get(objKey)); // {bar: "bar"}
109+
console.log(m.get(arrKey)); // ["bar"]
110+
111+
112+
const m = new Map();
113+
114+
const a = 0/"", // NaN
115+
b = 0/"", // NaN
116+
pz = +0,
117+
nz = -0;
118+
119+
alert(a === b); // false
120+
alert(pz === nz); // true
121+
122+
m.set(a, "foo");
123+
m.set(pz, "bar");
124+
125+
alert(m.get(b)); // foo
126+
alert(m.get(nz)); // bar
127+
128+
*/

阶段十五/Map顺序与迭代.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/**
2+
Map 实例会维护键值对的插入顺序
3+
4+
映射实例可以提供一个迭代器(Iterator),能以插入顺序生成[key, value]形式的数组。
5+
6+
通过 entries()方法(或者 Symbol.iterator 属性,它引用 entries())取得这个迭代器
7+
8+
9+
10+
const m = new Map([
11+
["key1", "val1"],
12+
["key2", "val2"],
13+
["key3", "val3"]
14+
]);
15+
16+
alert(m.entries === m[Symbol.iterator]); // true
17+
18+
for (let pair of m.entries()) {
19+
alert(pair);
20+
}
21+
// [key1,val1]
22+
// [key2,val2]
23+
// [key3,val3]
24+
25+
for (let pair of m[Symbol.iterator]()) {
26+
alert(pair);
27+
}
28+
// [key1,val1]
29+
// [key2,val2]
30+
// [key3,val3]
31+
32+
33+
34+
因为 entries()是默认迭代器,所以可以直接对映射实例使用扩展操作
35+
36+
const m = new Map([
37+
["key1", "val1"],
38+
["key2", "val2"],
39+
["key3", "val3"]
40+
]);
41+
console.log([...m]); // [[key1,val1],[key2,val2],[key3,val3]]
42+
43+
可以调用映射的 forEach(callback, opt_thisArg)
44+
45+
46+
const m = new Map([
47+
["key1", "val1"],
48+
["key2", "val2"],
49+
["key3", "val3"]
50+
]);
51+
52+
m.forEach((val, key) => alert(`${key} -> ${val}`));
53+
54+
// key1 -> val1
55+
// key2 -> val2
56+
// key3 -> val3
57+
58+
59+
const m = new Map([
60+
["key1", "val1"],
61+
["key2", "val2"],
62+
["key3", "val3"]
63+
]);
64+
65+
for (let key of m.keys()) {
66+
alert(key);
67+
}
68+
// key1
69+
// key2
70+
// key3
71+
72+
for (let key of m.values()) {
73+
alert(key);
74+
}
75+
// value1
76+
// value2
77+
// value3
78+
79+
80+
81+
82+
83+
const m1 = new Map([
84+
["key1", "val1"]
85+
]);
86+
// 作为键的字符串原始值是不能修改的
87+
for (let key of m1.keys()) {
88+
key = "newKey";
89+
alert(key); // newKey
90+
alert(m1.get("key1")); // val1
91+
}
92+
93+
94+
const keyObj = {id: 1};
95+
const m = new Map([
96+
[keyObj, "val1"]
97+
]);
98+
// 修改了作为键的对象的属性,但对象在映射内部仍然引用相同的值
99+
for (let key of m.keys()) {
100+
key.id = "newKey";
101+
alert(key); // {id: "newKey"}
102+
alert(m.get(keyObj)); // val1
103+
}
104+
alert(keyObj); // {id: "newKey"}
105+
106+
107+
*/

阶段十五/Set.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
3+
ECMAScript 6 新增的 Set 是一种新集合类型
4+
5+
使用 new 关键字和 Set 构造函数可以创建一个空集合:
6+
const m = new Set();
7+
8+
// 使用数组初始化集合
9+
const s1 = new Set(["val1", "val2", "val3"]);
10+
11+
alert(s1.size); // 3
12+
13+
14+
// 使用自定义迭代器初始化集合
15+
const s2 = new Set({
16+
[Symbol.iterator]: function*() {
17+
yield "val1";
18+
yield "val2";
19+
yield "val3";
20+
}
21+
});
22+
alert(s2.size); // 3
23+
24+
可以使用 add()增加值,使用 has()查询,通过 size 取得元素数量,以及使用 delete()和 clear()删除元素
25+
26+
const s = new Set();
27+
28+
alert(s.has("Matt")); // false
29+
alert(s.size); // 0
30+
31+
32+
s.add("Matt")
33+
.add("Frisbie");
34+
35+
alert(s.has("Matt")); // true
36+
alert(s.size); // 2
37+
38+
s.delete("Matt");
39+
40+
alert(s.has("Matt")); // false
41+
alert(s.has("Frisbie")); // true
42+
alert(s.size); // 1
43+
44+
45+
s.clear(); // 销毁集合实例中的所有值
46+
47+
alert(s.has("Matt")); // false
48+
alert(s.has("Frisbie")); // false
49+
alert(s.size); // 0
50+
51+
52+
const s = new Set().add("val1");
53+
s.add("val2")
54+
.add("val3");
55+
alert(s.size); // 3
56+
57+
58+
59+
const s = new Set();
60+
61+
const functionVal = function() {};
62+
const symbolVal = Symbol();
63+
const objectVal = new Object();
64+
65+
s.add(functionVal);
66+
s.add(symbolVal);
67+
s.add(objectVal);
68+
69+
alert(s.has(functionVal)); // true
70+
alert(s.has(symbolVal)); // true
71+
alert(s.has(objectVal)); // true
72+
73+
74+
// SameValueZero 检查意味着独立的实例不会冲突
75+
alert(s.has(function() {})); // false
76+
77+
78+
79+
80+
81+
82+
83+
84+
85+
*/

0 commit comments

Comments
 (0)