Skip to content

Commit 3aa426a

Browse files
authored
docs:fix errors
1 parent 106e8dd commit 3aa426a

File tree

1 file changed

+42
-43
lines changed

1 file changed

+42
-43
lines changed

6-data-storage/02-localstorage/article.md

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
# LocalStorage, sessionStorage
22

3-
Web 存储对象 `localStorage``sessionStorage` 允许你在浏览器上保存键值对
3+
Web 存储对象 `localStorage``sessionStorage` 允许我们在浏览器上保存键值对
44

55
有趣的是,数据在页面刷新(`sessionStorage`)甚至浏览器完全重启(`localStorage`)后仍然保留。我们很快会看到。
66

7-
我们已经有了 `cookies`。为什么还要额外的 web 存储对象
7+
我们已经有了 `cookies`。为什么还要额外的 web 存储对象呢
88

99
-`cookies` 不同,web 存储对象不会随着每次请求发送到服务端。因此,我们可以保存更多数据。大部分浏览器允许保存至少 2M 字节的数据(或者更多),并且是可配置的。
1010
- 还有一点和 `cookies` 不同,服务端不能通过 HTTP 头部操作存储对象。一切都在 `JavaScript` 中完成。
11-
- 存储对象的来源绑定在 `/协议/端口 三者之一` 下,也就是说,不同协议或者子域保存不同的存储对象,它们之间不能相互访问数据。
11+
- 存储绑定在同一个源(`域名/协议/端口 三者都相同`)下。也就是说,不同协议或者子域保存不同的存储对象,它们之间不能相互访问数据。
1212

1313
两个存储对象都提供相同的方法和属性:
1414

1515
- `setItem(key, value)` -- 存储键值对。
16-
- `getItem(key)` -- 根据键名获取相应的值
17-
- `removeItem(key)` -- 删除该键对应的键值对
18-
- `clear()` -- 清空存储
16+
- `getItem(key)` -- 根据键名获取值
17+
- `removeItem(key)` -- 删除单个数据
18+
- `clear()` -- 删除所有数据
1919
- `key(index)` -- 获取该索引下的键名。
20-
- `length` -- 存储对象的长度
20+
- `length` -- 存储数据的长度
2121

2222
正如你所看到的,它就像一个 `Map` 收集器(`setItem/getItem/removeItem`)。但是也保持着元素顺序,并且允许通过索引访问 `key(index)`
2323

@@ -27,7 +27,7 @@ Web 存储对象 `localStorage` 和 `sessionStorage` 允许你在浏览器上保
2727

2828
`localStorage` 最主要的特点是:
2929

30-
- 来自同一来源的数据在所有浏览器标签页和窗口之间共享
30+
- 同源的数据在所有浏览器标签页和窗口之间共享
3131
- 数据不会过期。它在浏览器重启甚至系统重启后仍然保留。
3232

3333
例如,如果你运行此代码…
@@ -42,9 +42,9 @@ localStorage.setItem('test', 1);
4242
alert( localStorage.getItem('test') ); // 1
4343
```
4444

45-
我们只要求数据存储在同一域/端口/协议上`url` 路径可以是不同的。
45+
我们只要求数据存储在同源上(域名/端口/协议都相同)`url` 路径可以是不同的。
4646

47-
`localStorage` 在相同来源下的所有窗口都是共享的。所以,如果我们在其中一个窗口设置了数据,在另外一个窗口中可以看到数据也发生了变化。
47+
同源的 `localStorage` 数据在所有窗口之间都是共享的。所以,如果我们在其中一个窗口设置了数据,在另外一个窗口中可以看到数据也发生了变化。
4848

4949
## 类似对象形式访问
5050

@@ -61,16 +61,16 @@ alert( localStorage.test ); // 2
6161
delete localStorage.test;
6262
```
6363

64-
这是历史原因允许的,并且大部分是有效的但是通常不推荐这种做法,有两个原因:
64+
这是历史原因允许的,并且大部分是有效的但是通常不推荐这种做法,有两个原因:
6565

66-
1. 如果键是由用户生成的,那么它可以是任何内容,例如 `length``toString`或者是 `localStorage` 下其他的内置方法。在这种情况下,`getItem/setItem` 可以正常使用,类似对象访问的方式则会失败。
66+
1. 如果键是由用户生成的,那么它可以是任何内容,例如 `length``toString`或者是其他 `localStorage` 的内置方法。在这种情况下,`getItem/setItem` 可以正常使用,类似对象访问的方式则会失败。
6767
2. 有一个 `storage` 事件,在我们改变数据时会触发。但是以类似对象形式访问时,该事件不会触发。我们可以在本章节后面看到。
6868

6969
## 循环键
7070

71-
正如我们看到的,这些方法提供了按键获取/设置/删除的功能。但是我们怎么能够保存所有的值或者键呢
71+
正如我们看到的,这些方法提供了按键获取/设置/删除的功能。但是我们怎么能够获取到所有保存的值或键呢
7272

73-
不幸的是,存储对象不可迭代
73+
不幸的是,存储对象是不可迭代的
7474

7575
一种方法是在数组上循环遍历它们:
7676

@@ -83,7 +83,7 @@ for(let i=0; i<localStorage.length; i++) {
8383

8484
另一个方法是使用 `for key in localStorage` 循环,就像我们循环普通对象一样。
8585

86-
它循环所有的键,但是也输出了我们不需要的的几个内置字段。
86+
它迭代所有的键,但是也输出了我们不需要的的几个内置字段。
8787

8888
```js run
8989
// bad try
@@ -97,13 +97,13 @@ for(let key in localStorage) {
9797
```js run
9898
for(let key in localStorage) {
9999
if (!localStorage.hasOwnProperty(key)) {
100-
continue; // 跳过键, setItem,getItem 等
100+
continue; // 跳过键,例如 setItem,getItem 等
101101
}
102102
alert(`${key}: ${localStorage.getItem(key)}`);
103103
}
104104
```
105105

106-
或者使用 `Object.keys` 获取本身的键,然后根据需要循环它:
106+
或者使用 `Object.keys` 获取本身的属性,然后根据需要循环它:
107107

108108
```js run
109109
let keys = Object.keys(localStorage);
@@ -112,7 +112,7 @@ for(let key of keys) {
112112
}
113113
```
114114

115-
后者有效,因为 `Object.keys` 只返回属于对象的键,忽略原型
115+
后者有效,因为 `Object.keys` 只返回属于对象的属性,忽略原型上的
116116

117117
## 只有字符串
118118

@@ -144,14 +144,14 @@ alert( JSON.stringify(localStorage, null, 2) );
144144

145145
## sessionStorage
146146

147-
`sessionStorage` 的使用频率比 `localStorage` 少。
147+
`sessionStorage` 的使用频率比 `localStorage` 少。
148148

149149
属性和方法是相同的,但是它具有更多的局限性:
150150

151-
- `sessionStorage` 只存在于当前浏览器标签页
151+
- `sessionStorage` 的数据只存在于当前浏览器标签页
152152
- 具有相同页面的另外一个浏览器标签页中将会有不同的存储。
153-
- 但是它在当前标签页下的 `iframes` 之间是共享的(假如它们是同一来源)。
154-
- 数据在页面刷新后还保留,但是在关闭重新打开浏览器标签页后不会被保留。
153+
- 但是它在当前标签页下的 `iframes` 之间是共享的(假如它们是同源的)。
154+
- 数据在页面刷新后仍然保留,但是在关闭重新打开浏览器标签页后不会被保留。
155155

156156
让我们看看它是怎么运行的。
157157

@@ -169,23 +169,23 @@ alert( sessionStorage.getItem('test') ); // after refresh: 1
169169

170170
但是如果你在新的标签页中打开此页面,然后在新的页面中运行以上代码,则会返回 `null`,意思是找不到数据。
171171

172-
这是因为是 `sessionStorage` 不仅仅要求数据同源,还需要在同一浏览器标签页下。因此,请谨慎使用 `sessionStorage`
172+
这是因为 `sessionStorage` 的数据不仅仅绑定在同源下,还绑定在同一浏览器标签页下。因此,请谨慎使用 `sessionStorage`
173173

174174
## Storage 事件
175175

176-
`localStorage``sessionStorage` 中的数据更新后,[storage 事件](https://www.w3.org/TR/webstorage/#the-storage-event)将会触发,具有以下特征
176+
`localStorage``sessionStorage` 中的数据更新后,[storage](https://www.w3.org/TR/webstorage/#the-storage-event)事件将会触发,具有以下属性
177177

178-
- `key``key` 将会被改变(如果调用的是 `.clear()` 方法,`key` 会返回 `null`)
179-
- `oldValue` — 旧值(如果是新增 `key`,会返回 `null`)
180-
- `newValue` — 新值(如果是删除 `key`,会返回 `null`)
178+
- `key`数据发生改变的 `key`如果调用的是 `.clear()` 方法,`key` 会返回 `null`
179+
- `oldValue` — 旧值(如果是新增数据,会返回 `null`
180+
- `newValue` — 新值(如果是删除数据,会返回 `null`
181181
- `url` — 数据发生更新时的文档链接。
182-
- `storageArea`数据发生更新的任何一个 `localStorage``sessionStorage` 对象。
182+
- `storageArea`数据发生更新的 `localStorage``sessionStorage` 对象。
183183

184-
最重要的是:事件将会在所有能访问到当前存储对象的 `window` 下触发,除了当前触发了事件的 `window`
184+
最重要的是:事件将会在所有能访问到当前存储对象的 `window` 下触发,除了当前数据改变的 `window`
185185

186186
我们来详细说明一下。
187187

188-
想象一下,你有两个两个窗口,每个窗口都有相同的页面。所以 `localStorage` 在它们之间是共享的。
188+
想象一下,你有两个窗口,每个窗口具有相同的页面。所以 `localStorage` 在它们之间是共享的。
189189

190190
```online
191191
你可以在两个浏览器窗口中打开当前页面来测试下面的代码。
@@ -203,14 +203,13 @@ window.onstorage = event => {
203203
localStorage.setItem('now', Date.now());
204204
```
205205

206-
请注意,该事件还包括 `event.url` -- 数据更新时的文档链接
206+
请注意,该事件还包括 `event.url` -- 数据更新了的文档链接
207207

208-
此外,`event.storageArea` 还会返回存储对象 -- 因为 `sessionStorage``localStorage` 具有相同的事件,所以 `storageArea` 会返回数据更新了的那一个存储对象。为了响应数据更新,我们也许会在里面设置一些东西。
208+
此外,`event.storageArea` 还会返回存储对象 -- 因为 `sessionStorage``localStorage` 具有相同的事件,所以 `storageArea` 会返回数据发生改变的存储对象。为了响应数据更新,我们也许会在里面设置一些东西。
209209

210-
** 这允许来自相同来源的不同窗口交换消息。 **
211-
212-
现代浏览器还支持 [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API),这是用于同源窗口之间通信的特殊 API,它的功能更加全面,但是兼容性还不好。有一些库可以基于 `localStorage` polyfill 该 API,使其可以用在任何地方。
210+
** 这允许同源的不同窗口交换消息。 **
213211

212+
现代浏览器还支持 [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API),这是用于同源窗口之间通信的特殊 API,它的功能更加全面,但是兼容性还不好。有一些库可以基于 `localStorage` polyfill 该 API,使其可以用在任何地方。
214213

215214
## 总结
216215

@@ -219,26 +218,26 @@ Web 存储对象 `localStorage` 和 `sessionStorage` 允许我们在浏览器中
219218
- 所有的 `key``value` 都必须是字符串。
220219
- 存储大小限制为 2mb+,取决于浏览器也会有所不同。
221220
- 它们不会过期。
222-
- 数据绑定在同一来源下(域名/端口/协议)。
221+
- 数据绑定在同源下(域名/端口/协议都相同)。
223222

224223
| `localStorage` | `sessionStorage` |
225224
|----------------|------------------|
226-
| 在同源的所有标签页和窗口之间共享 | 在浏览器标签中可见,包括来自同一来源的iframe |
225+
| 同源的所有标签页和窗口之间共享数据 | 作用域在一个浏览器标签下,包括同源的 iframes |
227226
| 浏览器重启后数据仍然保留 | 页面刷新后数据仍然保留(不包括标签页关闭) |
228227

229228
API:
230229

231230
- `setItem(key, value)` -- 存储键值对。
232-
- `getItem(key)` -- 根据键名获取相应的值
233-
- `removeItem(key)` -- 删除该键对应的键值对
234-
- `clear()` -- 清空存储
231+
- `getItem(key)` -- 根据键名获取值
232+
- `removeItem(key)` -- 删除单个数据
233+
- `clear()` -- 删除所有数据
235234
- `key(index)` -- 获取该索引下的键名。
236-
- `length` -- 存储对象的长度
235+
- `length` -- 存储数据的长度
237236
- 使用 `Object.keys` 获取所有的键。
238237
- 假如我们使用对象属性的形式来访问键,则 `storage` 事件不会被触发。
239238

240239
Storage 事件:
241240

242241
- 在调用 `setItem``removeItem``clear`方法后触发。
243-
- 包含有关操作,文档 `url` 和存储对象的所有数据。
244-
- 在除当前触发了事件的对象以外所有能访问到存储对象的 `window` 对象上都会被触发(在 `sessionStorage` 有效范围的同一标签页下,在 `localStorage` 的有效范围下)。
242+
- 返回包含有关操作,文档 `url` 和存储对象的所有数据。
243+
- 在除当前数据改变的对象以外所有能访问到存储对象的 `window` 对象上都会被触发(在 `sessionStorage` 有效范围的同一标签页下,在 `localStorage` 的有效范围下)。

0 commit comments

Comments
 (0)