var arr = [{a:1}, {b:2}];
setCookie('key', arr); // 直接存對象
// Cookie 實際值:[object Object],[object Object]
getCookie('key'); // 讀出字符串 "[object Object],[object Object]",無法還原數組
Cookie 只能存**字符串**。直接賦值對象會隱式調用 toString(),輸出 "[object Object]",信息丟失。
// 存儲
function setCookie(name, value, days) {
var json = JSON.stringify(value); // 1. 對象 → JSON 字符串
var encoded = encodeURIComponent(json); // 2. 編碼特殊字符(分號、逗號、空格等)
var expires = "";
if (days) {
var d = new Date();
d.setTime(d.getTime() + days * 86400000);
expires = "; expires=" + d.toUTCString();
}
document.cookie = name + "=" + encoded + expires + "; path=/";
}
// 讀取
function getCookie(name) {
var prefix = name + "=";
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var c = cookies[i].trim();
if (c.indexOf(prefix) === 0) {
var encoded = c.substring(prefix.length);
var json = decodeURIComponent(encoded); // 3. 解碼
return JSON.parse(json); // 4. JSON 字符串 → 對象/數組
}
}
return null;
}
// 使用
var arr = [{a:1}, {b:2}];
setCookie('myArr', arr, 7);
var restored = getCookie('myArr'); // 還原為 [{a:1}, {b:2}]
console.log(restored[0].a); // 1
localStorage (5MB+)。json2.js(<!--[if lt IE 8]><script src="json2.js"></script><![endif]-->)。const CookieUtil = {
set(name, value, days) { /* 上述邏輯 */ },
get(name) { /* 上述邏輯 */ },
remove(name) { document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; }
};
JS Cookie 存數組/對象:**JSON.stringify 序列化 → encodeURIComponent 編碼 → 存儲**;讀取時**解碼 → JSON.parse 反序列化**。配合大小限制檢查、舊瀏覽器 polyfill,即可可靠持久化結構化數據。