const STORAGE_KEYS = 'uni-storage-keys' function parseValue (value) { const types = ['object', 'string', 'number', 'boolean', 'undefined'] try { const object = typeof value === 'string' ? JSON.parse(value) : value const type = object.type if (types.indexOf(type) >= 0) { const keys = Object.keys(object) if (keys.length === 2 && 'data' in object) { // eslint-disable-next-line valid-typeof if (typeof object.data === type) { return object.data } // eslint-disable-next-line no-useless-escape if (type === 'object' && /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z$/.test(object.data)) { // ISO 8601 格式返回 Date return new Date(object.data) } } else if (keys.length === 1) { return '' } } } catch (error) { } } export function setStorage ({ key, data } = {}) { const type = typeof data const value = type === 'string' ? data : JSON.stringify({ type, data: data }) try { localStorage.setItem(key, value) } catch (error) { return { errMsg: `setStorage:fail ${error}` } } return { errMsg: 'setStorage:ok' } } export function setStorageSync (key, data) { setStorage({ key, data }) } export function getStorage ({ key } = {}) { const value = localStorage && localStorage.getItem(key) if (typeof value !== 'string') { return { data: '', errMsg: 'getStorage:fail' } } let data = value try { const object = JSON.parse(value) const result = parseValue(object) if (result !== undefined) { data = result } } catch (error) { } return { data, errMsg: 'getStorage:ok' } } export function getStorageSync (key) { const res = getStorage({ key }) return res.data } export function removeStorage ({ key } = {}) { if (localStorage) { localStorage.removeItem(key) } return { errMsg: 'removeStorage:ok' } } export function removeStorageSync (key) { removeStorage({ key }) } export function clearStorage () { localStorage && localStorage.clear() return { errMsg: 'clearStorage:ok' } } export function clearStorageSync () { clearStorage() } export function getStorageInfo () { const length = (localStorage && localStorage.length) || 0 const keys = [] let currentSize = 0 for (let index = 0; index < length; index++) { const key = localStorage.key(index) const value = localStorage.getItem(key) currentSize += key.length + value.length if (key !== STORAGE_KEYS) { keys.push(key) } } return { keys, currentSize: Math.ceil(currentSize * 2 / 1024), limitSize: Number.MAX_VALUE, errMsg: 'getStorageInfo:ok' } } export function getStorageInfoSync () { const res = getStorageInfo() delete res.errMsg return res }