Web åå¨å¯¹è±¡ localStorage å sessionStorage å
许æä»¬å¨æµè§å¨ä¸ä¿åé®/å¼å¯¹ã
å®ä»¬æè¶£çæ¯ï¼å¨é¡µé¢å·æ°åï¼å¯¹äº sessionStorageï¼çè³æµè§å¨å®å
¨éå¯ï¼å¯¹äº localStorageï¼åï¼æ°æ®ä»ç¶ä¿ç卿µè§å¨ä¸ãæä»¬å¾å¿«å°±ä¼çå°ã
æä»¬å·²ç»æäº cookieã为ä»ä¹è¿è¦å ¶ä»åå¨å¯¹è±¡å¢ï¼
- ä¸ cookie ä¸åï¼Web åå¨å¯¹è±¡ä¸ä¼éæ¯ä¸ªè¯·æ±è¢«åéå°æå¡å¨ãå æ¤ï¼æä»¬å¯ä»¥ä¿åæ´å¤æ°æ®ã大夿°ç°ä»£æµè§å¨é½å 许ä¿åè³å° 5MB çæ°æ®ï¼ææ´å¤ï¼ï¼å¹¶ä¸å ·æç¨äºé ç½®æ°æ®ç设置ã
- è¿æä¸ç¹å cookie ä¸åï¼æå¡å¨æ æ³éè¿ HTTP header æçºµåå¨å¯¹è±¡ãä¸å齿¯å¨ JavaScript ä¸å®æçã
- åå¨ç»å®å°æºï¼å/åè®®/端å£ä¸è ï¼ãä¹å°±æ¯è¯´ï¼ä¸ååè®®æåå对åºä¸åçåå¨å¯¹è±¡ï¼å®ä»¬ä¹é´æ æ³è®¿é®å½¼æ¤æ°æ®ã
两个åå¨å¯¹è±¡é½æä¾ç¸åçæ¹æ³å屿§ï¼
setItem(key, value)ââ åå¨é®/å¼å¯¹ãgetItem(key)ââ æç §é®è·åå¼ãremoveItem(key)ââ å é¤é®åå ¶å¯¹åºçå¼ãclear()ââ å é¤æææ°æ®ãkey(index)ââ è·å该索å¼ä¸çé®åãlengthââ åå¨çå 容çé¿åº¦ã
æ£å¦ä½ æçå°çï¼å®å°±åä¸ä¸ª Map éåï¼setItem/getItem/removeItemï¼ï¼ä½ä¹å
许éè¿ key(index) æ¥æç´¢å¼è®¿é®ã
让æä»¬çç宿¯å¦ä½å·¥ä½çå§ã
localStorage 示ä¾
localStorage æä¸»è¦çç¹ç¹æ¯ï¼
- å¨åæºçæææ ç¾é¡µåçªå£ä¹é´å ±äº«æ°æ®ã
- æ°æ®ä¸ä¼è¿æãå®å¨æµè§å¨éå¯çè³ç³»ç»éå¯åä»ç¶åå¨ã
ä¾å¦ï¼å¦æä½ è¿è¡æ¤ä»£ç â¦â¦
localStorage.setItem('test', 1);
â¦â¦ç¶åå ³é/éæ°æå¼æµè§å¨ï¼æè åªæ¯å¨ä¸åççªå£æå¼åä¸é¡µé¢ï¼ç¶åä½ å¯ä»¥è¿æ ·è·åå®ï¼
alert( localStorage.getItem('test') ); // 1
æä»¬åªéè¦å¨åä¸ä¸ªæºï¼å/端å£/åè®®ï¼ï¼URL è·¯å¾å¯ä»¥ä¸åã
卿æåæºççªå£ä¹é´ï¼localStorage æ°æ®å¯ä»¥å
±äº«ãå æ¤ï¼å¦ææä»¬å¨ä¸ä¸ªçªå£ä¸è®¾ç½®äºæ°æ®ï¼åå¨å¦ä¸ä¸ªçªå£ä¸ä¹å¯ä»¥çå°æ°æ®ååã
类对象形å¼è®¿é®
æä»¬è¿å¯ä»¥å使ç¨ä¸ä¸ªæ®éå¯¹è±¡é£æ ·ï¼è¯»å/设置é®ï¼åè¿æ ·ï¼
// 设置 key
localStorage.test = 2;
// è·å key
alert( localStorage.test ); // 2
// å é¤ key
delete localStorage.test;
è¿æ¯åå²åå é æçï¼å¹¶ä¸å¤§å¤æ°æ åµä¸é½å¯è¡ï¼ä½é常ä¸å»ºè®®è¿æ ·åï¼å 为ï¼
-
妿鮿¯ç±ç¨æ·çæçï¼é£ä¹å®å¯ä»¥æ¯ä»»ä½å 容ï¼ä¾å¦
lengthætoStringï¼ä¹å¯ä»¥æ¯localStorageçå¦ä¸ç§å å»ºæ¹æ³ãå¨è¿ç§æ åµä¸ï¼getItem/setItemå¯ä»¥æ£å¸¸å·¥ä½ï¼è类对象访é®çæ¹å¼åä¼å¤±è´¥ï¼let key = 'length'; localStorage[key] = 5; // Errorï¼æ æ³å¯¹ length è¿è¡èµå¼ -
æä¸ä¸ª
storageäºä»¶ï¼å¨æä»¬æ´æ¹æ°æ®æ¶ä¼è§¦åãä½ä»¥ç±»å¯¹è±¡æ¹å¼è®¿é®æ¶ï¼ä¸ä¼è§¦å该äºä»¶ãæä»¬å°å¨æ¬ç« çåé¢çå°ã
éåé®
æ£å¦æä»¬æçå°çï¼è¿äºæ¹æ³æä¾äºâæç §é®è·å/设置/å é¤âçåè½ã使们å¦ä½è·åææä¿åç弿é®å¢ï¼
ä¸å¹¸çæ¯ï¼åå¨å¯¹è±¡æ¯ä¸å¯è¿ä»£çã
ä¸ç§æ¹æ³æ¯åéåæ°ç»é£æ ·éåå®ä»¬ï¼
for(let i = 0; i < localStorage.length; i++) {
let key = localStorage.key(i);
alert(`${key}: ${localStorage.getItem(key)}`);
}
å¦ä¸ä¸ªæ¹å¼æ¯ä½¿ç¨ for key in localStorage 循ç¯ï¼å°±åå¤ç常è§å¯¹è±¡ä¸æ ·ã
å®ä¼éåææçé®ï¼ä½ä¹ä¼è¾åºä¸äºæä»¬ä¸éè¦çå å»ºåæ®µã
// ä¸å¥½çå°è¯
for(let key in localStorage) {
alert(key); // æ¾ç¤º getItemï¼setItem åå
¶ä»å
建çä¸è¥¿
}
â¦â¦å æ¤ï¼æä»¬éè¦ä½¿ç¨ hasOwnProperty æ£æ¥æ¥è¿æ»¤æååä¸çåæ®µï¼
for(let key in localStorage) {
if (!localStorage.hasOwnProperty(key)) {
continue; // è·³è¿å "setItem"ï¼"getItem" çè¿æ ·çé®
}
alert(`${key}: ${localStorage.getItem(key)}`);
}
â¦â¦æè
ï¼ä½¿ç¨ Object.keys è·ååªå±äºâèªå·±âçé®ï¼ç¶å妿éè¦ï¼å¯ä»¥éåå®ä»¬ï¼
let keys = Object.keys(localStorage);
for(let key of keys) {
alert(`${key}: ${localStorage.getItem(key)}`);
}
åè
ææï¼å 为 Object.keys åªè¿åå±äºå¯¹è±¡çé®ï¼ä¼å¿½ç¥ååä¸çã
ä» å符串
请注æï¼é®åå¼é½å¿ é¡»æ¯å符串ã
妿æ¯ä»»ä½å ¶ä»ç±»åï¼ä¾æ°åæå¯¹è±¡ï¼å®ä¼è¢«èªå¨è½¬æ¢ä¸ºå符串ã
localStorage.user = {name: "John"};
alert(localStorage.user); // [object Object]
æä»¬å¯ä»¥ä½¿ç¨ JSON æ¥åå¨å¯¹è±¡ï¼
localStorage.user = JSON.stringify({name: "John"});
// sometime later
let user = JSON.parse( localStorage.user );
alert( user.name ); // John
ä¹å¯ä»¥å¯¹æ´ä¸ªåå¨å¯¹è±¡è¿è¡å符串åå¤çï¼ä¾å¦åºäºè°è¯ç®çï¼
// 为 JSON.stringify å¢å äºæ ¼å¼è®¾ç½®é项ï¼ä»¥ä½¿å¯¹è±¡çèµ·æ¥æ´ç¾è§
alert( JSON.stringify(localStorage, null, 2) );
sessionStorage
sessionStorage 对象ç使ç¨é¢çæ¯ localStorage 对象ä½å¾å¤ã
屿§åæ¹æ³æ¯ç¸åçï¼ä½æ¯å®ææ´å¤çéå¶ï¼
sessionStorageçæ°æ®åªåå¨äºå½åæµè§å¨æ ç¾é¡µã- å ·æç¸å页é¢çå¦ä¸ä¸ªæ ç¾é¡µä¸å°ä¼æä¸åçåå¨ã
- 使¯ï¼å®å¨å䏿 ç¾é¡µä¸ç iframe ä¹é´æ¯å ±äº«çï¼åå¦å®ä»¬æ¥èªç¸åçæºï¼ã
- æ°æ®å¨é¡µé¢å·æ°åä»ç¶ä¿çï¼ä½å¨å ³é/éæ°æå¼æµè§å¨æ ç¾é¡µåä¸ä¼è¢«ä¿çã
让æä»¬ççå®çè¿è¡ææã
è¿è¡æ¤ä»£ç â¦â¦
sessionStorage.setItem('test', 1);
â¦â¦ç¶åå·æ°é¡µé¢ãè¿æ¶ä½ ä»ç¶å¯ä»¥è·åå°æ°æ®ï¼
alert( sessionStorage.getItem('test') ); // after refresh: 1
â¦â¦ä½æ¯ï¼å¦æä½ å¨å¦ä¸ä¸ªæ°çæ ç¾é¡µä¸æå¼æ¤é¡µé¢ï¼ç¶å卿°é¡µé¢ä¸å次è¿è¡ä¸é¢è¿è¡ä»£ç ï¼åä¼å¾å° nullï¼è¡¨ç¤ºâæªæ¾å°æ°æ®âã
è¿æ¯å 为 sessionStorage ä¸ä»
ç»å®å°æºï¼è¿ç»å®å¨å䏿µè§å¨æ ç¾é¡µãå æ¤ï¼sessionStorage å¾å°è¢«ä½¿ç¨ã
Storage äºä»¶
å½ localStorage æ sessionStorage ä¸çæ°æ®æ´æ°åï¼storage äºä»¶å°±ä¼è§¦åï¼å®å
·æä»¥ä¸å±æ§ï¼
keyââ åçæ´æ¹çæ°æ®çkeyï¼å¦æè°ç¨çæ¯.clear()æ¹æ³ï¼å为nullï¼ãoldValueââ æ§å¼ï¼å¦ææ¯æ°å¢æ°æ®ï¼å为nullï¼ãnewValueââ æ°å¼ï¼å¦ææ¯å 餿°æ®ï¼å为nullï¼ãurlââ åçæ°æ®æ´æ°çææ¡£ç urlãstorageAreaââ åçæ°æ®æ´æ°çlocalStorageæsessionStorage对象ã
éè¦çæ¯ï¼è¯¥äºä»¶ä¼å¨ææå¯è®¿é®å°åå¨å¯¹è±¡ç window 对象ä¸è§¦åï¼å¯¼è´å½åæ°æ®æ¹åç window 对象é¤å¤ã
æä»¬æ¥è¯¦ç»è§£éä¸ä¸ã
æ³è±¡ä¸ä¸ï¼ä½ æä¸¤ä¸ªçªå£ï¼å®ä»¬å
·æç¸åç页é¢ãæä»¥ localStorage å¨å®ä»¬ä¹é´æ¯å
±äº«çã
ä½ å¯ä»¥æ³å¨æµè§å¨ç两个çªå£ä¸æå¼æ¤é¡µé¢æ¥æµè¯ä¸é¢ç代ç ã
å¦æä¸¤ä¸ªçªå£é½å¨çå¬ window.onstorage äºä»¶ï¼é£ä¹æ¯ä¸ªçªå£é½ä¼å¯¹å¦ä¸ä¸ªçªå£ä¸åççæ´æ°ä½åºååºã
// å¨å
¶ä»ææ¡£å¯¹åä¸åå¨è¿è¡æ´æ°æ¶è§¦å
window.onstorage = event => { // ä¹å¯ä»¥ä½¿ç¨ window.addEventListener('storage', event => {
if (event.key != 'now') return;
alert(event.key + ':' + event.newValue + " at " + event.url);
};
localStorage.setItem('now', Date.now());
请注æï¼è¯¥äºä»¶è¿å
å«ï¼event.url ââ åçæ°æ®æ´æ°çææ¡£ç urlã
å¹¶ä¸ï¼event.storageArea å
å«åå¨å¯¹è±¡ ââ sessionStorage å localStorage å
·æç¸åçäºä»¶ï¼æä»¥ event.storageArea å¼ç¨äºè¢«ä¿®æ¹ç对象ãæä»¬å¯è½ä¼æ³è®¾ç½®ä¸äºä¸è¥¿ï¼ä»¥âååºâæ´æ¹ã
è¿å è®¸åæºçä¸åçªå£äº¤æ¢æ¶æ¯ã
ç°ä»£æµè§å¨è¿æ¯æ Broadcast channel APIï¼è¿æ¯ç¨äºåæºçªå£ä¹é´éä¿¡çç¹æ® APIï¼å®çåè½æ´å
¨ï¼ä½è¢«æ¯æçæ
åµä¸å¥½ãæä¸äºåºåºäº localStorage æ¥ polyfill 该 APIï¼ä½¿å
¶å¯ä»¥ç¨å¨ä»»ä½å°æ¹ã
æ»ç»
Web åå¨å¯¹è±¡ localStorage å sessionStorage å
许æä»¬å¨æµè§å¨ä¸ä¿åé®/å¼å¯¹ã
keyåvalueé½å¿ 须为å符串ã- åå¨å¤§å°éå¶ä¸º 5MB+ï¼å ·ä½åå³äºæµè§å¨ã
- å®ä»¬ä¸ä¼è¿æã
- æ°æ®ç»å®å°æºï¼å/端å£/åè®®ï¼ã
localStorage |
sessionStorage |
|---|---|
| å¨åæºçæææ ç¾é¡µåçªå£ä¹é´å ±äº«æ°æ® | å¨å½åæµè§å¨æ ç¾é¡µä¸å¯è§ï¼å æ¬åæºç iframe |
| æµè§å¨éå¯åæ°æ®ä»ç¶ä¿ç | 页é¢å·æ°åæ°æ®ä»ç¶ä¿çï¼ä½æ ç¾é¡µå ³éåæ°æ®åä¸åä¿çï¼ |
APIï¼
setItem(key, value)ââ åå¨é®/å¼å¯¹ãgetItem(key)ââ æç §é®è·åå¼ãremoveItem(key)ââ å é¤é®åå ¶å¯¹åºçå¼ãclear()ââ å é¤æææ°æ®ãkey(index)ââ è·å该索å¼ä¸çé®åãlengthââ åå¨çå 容çé¿åº¦ã- 使ç¨
Object.keysæ¥è·åææçé®ã - æä»¬å°é®ä½ä¸ºå¯¹è±¡å±æ§æ¥è®¿é®ï¼å¨è¿ç§æ
åµä¸ï¼ä¸ä¼è§¦å
storageäºä»¶ã
Storage äºä»¶ï¼
- å¨è°ç¨
setItemï¼removeItemï¼clearæ¹æ³å触åã - å
嫿å
³æä½çæææ°æ®ï¼
key/oldValue/newValueï¼ï¼ææ¡£urlååå¨å¯¹è±¡storageAreaã - 卿æå¯è®¿é®å°åå¨å¯¹è±¡ç
window对象ä¸è§¦åï¼å¯¼è´å½åæ°æ®æ¹åçwindow对象é¤å¤ï¼å¯¹äºsessionStorageæ¯å¨å½åæ ç¾é¡µä¸ï¼å¯¹äºlocalStorageæ¯å¨å ¨å±ï¼å³ææåæºççªå£ï¼ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼