我常问的一道关于考察设计能力的面试题

600 阅读3分钟

最近,公司在进行团队扩充,会进行一些人员面试的工作。

除了基础八股文知识, 我更看中候选人对具体场景问题的设计和解决能力。

所以在我的日常面试中,最常问的一个问题就是,关于本地存储能力的封装。

问题

  1. 我们在日常开发中,用到的本地存储都有哪些啊?
  2. 他们各自有什么优劣啊?
  3. 我们应该如何利用现有浏览器提供的本地存储能力(storage, cookie) 实现一个新的存储工具,让它拥有更好浏览器兼容性、 更友好的API存储JS对象、 同时还能支持单一值的过期时间限制呢?

考察能力

ok, 废话不多说。 我们来对这3个小问题设计的思想进行一下揭示。

第一题解析:

答案:

cookie 、localStoreage 、 sessionStorage 、 IndexDB (这个其实聊到的很少)。

这一题绝大多数候选人都能答出来, 偶尔会有很年轻的同学会说,我只知道 localStorage、 sessionStorage。

这题考察的,就是基础知识掌握,跟候选人,对齐一下前提认知。方便后续引出存储工具的设计题目。

因为特别简单,也能让候选人放松下来,去更好的展现自己的真实能力。

第二题解析:

答案:

差异storagecookie
存储大小5M4K, 20 - 50个左右
存储类型utf-16, 文本文本
存储时效永久可设置
共享性当前域可设置存储域根域
事件回调
网络请求不被网络请求携带被网络请求携带
存取方式set, get API替换整体Cookie

等等, 上表列出了一些我们常见的差异。

解析:

这一题主要考察对,两种存储方式的异同的了解。 和各自存储方式更擅长做的一些事情。

绝大部分人,也都能知道一些异同性,或者 经过引导可以知道一些异同性。 便于我们提出本次设计问题的最终问题第三题。

第三题解析:

答案:

因为, 直接操作cookie的增删改查比较麻烦为了本次示例代码的简单性,我们直接用jscookie代替复杂的cookie 操作。 本代码仅做考察点,示例。


type storageItme = {
	data: string,
	expires?: date 
}

import * as jscookie from 'jscookie';


class Storage {
	
	constructor() {
	
	}
	
	setItem(key, data, expires) {
		// 适配器模式
		const storageData: storageItme = {
				data
		};
			
		expires && (storageData. expires = expires);
		
		
		if(window.localStorage) {
			this._setStorage(key, storageData);
		} else {
			this._setCookie(key, storageData);
		}
		
	}
	
	private _setCookie(key, item: storageItme) {
		if (item.expires) {
				
			jscookie.set({
				name: key,
				value: JSON.stringify(item),
				expires: expires 
			})		
		} else {
			jscookie.set(key, JSON.stringify(item))
		}
	}
	
	private _setStorage(key, item: storageItme) {
		
		localStorage.setItem(key, JSON.stringify(item))
	}
	
	getItem(key) {
		// 直接去取值
		if(window.localStorage) {
			let data = localStorage.getItem(key)
			if(!data) return null;
			data = JSON.parse(data);
			
			if(data.expires) {
				// 用Date 判断是否过期
				
				if(过期) {
					return null
				} else {
					return  data.data
				}
			} 
			
		}
		
		// .... 省略一些示例代码
		
	
	}

}


上述代码示例。 基本描述了实现过程。

我们现在来揭示一下,思考过程。

  1. 存储对象。 也就是API 拿到数据之后,由工具框架进行JSON 格式化转换。

  2. 更好的兼容性。 对localStore 进行适配器降级。 如果不支持,则用cookie 进行存储。

  3. 过期时间限制。 cookie不用做任何考虑直接就取出undefined 了,如果是localStorage 引擎,则我们在格式成对象后,进行过期与否的判断,并进行数据移除。 这个地方,需要考虑的时候,很多候选人会考虑定时轮询进行数据的移除是很不可取的。

**感谢您的阅读,希望能帮助到您。 **