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);
4242alert ( 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
6161delete localStorage .test ;
6262```
6363
64- 这是历史原因允许的,并且大部分是有效的。 但是通常不推荐这种做法,有两个原因:
64+ 这是历史原因允许的,并且大部分是有效的, 但是通常不推荐这种做法,有两个原因:
6565
66- 1 . 如果键是由用户生成的,那么它可以是任何内容,例如 ` length ` 或 ` toString ` ,或者是 ` localStorage ` 下其他的内置方法 。在这种情况下,` getItem/setItem ` 可以正常使用,类似对象访问的方式则会失败。
66+ 1 . 如果键是由用户生成的,那么它可以是任何内容,例如 ` length ` 或 ` toString ` ,或者是其他 ` localStorage ` 的内置方法 。在这种情况下,` getItem/setItem ` 可以正常使用,类似对象访问的方式则会失败。
67672 . 有一个 ` 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
9898for (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
109109let 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 => {
203203localStorage .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
229228API:
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
240239Storage 事件:
241240
242241- 在调用 ` setItem ` ,` removeItem ` ,` clear ` 方法后触发。
243- - 包含有关操作 ,文档 ` url ` 和存储对象的所有数据。
244- - 在除当前触发了事件的对象以外所有能访问到存储对象的 ` window ` 对象上都会被触发(在 ` sessionStorage ` 有效范围的同一标签页下,在 ` localStorage ` 的有效范围下)。
242+ - 返回包含有关操作 ,文档 ` url ` 和存储对象的所有数据。
243+ - 在除当前数据改变的对象以外所有能访问到存储对象的 ` window ` 对象上都会被触发(在 ` sessionStorage ` 有效范围的同一标签页下,在 ` localStorage ` 的有效范围下)。
0 commit comments