# 程序设计
# 基于 localStorage 设计一个 1M 的缓存系统,需要实现缓存淘汰机制
思路:
- 存储的每个对象需要添加两个属性:分别是过期时间和存储时间。
- 利用一个属性保存系统中目前所占空间大小,每次存储都增加该属性。当该属性值大于 1M 时,需要按照时间排序系统中的数据,删除一定量的数据保证能够存储下目前需要存储的数据。
- 每次取数据时,需要判断该缓存数据是否过期,如果过期就删除
# 在nodejs开发的时候 处理过什么windows和mac的平台兼容性问题
- 兼容环境变量设置,用cross-env,因为export和set有系统差异性
- windows不支持 & ,并行执行npm-script用npm-run-all或者concurrently
- 异步同步化: util.promisify + async/await
- 不要直接用官网的
fs.readFileSync
,用fs-extra
去代替 - 拼接路径要用
path.join
,Unix系是/
,Windows是\
# 设计一个方案,在浏览器中点击一个button,然后能在你的前端项目源码文件中增加一个index.js文件,如何实现?提供思路
思路一 都是约定好一个规范,然后实现一个bridge桥接去进行权限穿透。要写出来就太多了,大家可以自行去研究一下
思路二 还有一个思路,涉及到npm + cli + node server去实现。首先实现一个npm插件,在bin里注册一个命令,当你在前端项目中npm run start后,调用这个命令,通过这个命令起一个node-dev-server,然后通过http请求去让这个node-dev-server去创建index.js文件
# 如果一个实习生,他本地git的A分支被误删了, A分支代码没有被push到远程,如何找到之前A的提交记录和代码
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
例如执行 git reset --hard HEAD~1
,退回到上一个版本,用git log则是看不出来被删除的commitid
,用git reflog
则可以看到被删除的commitid
,我们就可以买后悔药,恢复到被删除的那个版本
# 用nodejs,将base64转化成png文件
const fs = require('fs');
const path = 'xxx/'+ Date.now() +'.png';
const base64 = data.replace(/^data:image\/\w+;base64,/, "");//去掉图片base64码前面部分data:image/png;base64
const dataBuffer = new Buffer(base64, 'base64'); //把base64码转成buffer对象
fs.writeFile(path, dataBuffer, function(err){//用fs写入文件
if(err){
console.log(err);
}else{
console.log('写入成功!');
}
})
# 大文件转存问题:服务器A有一个1000G的文件, 需要通过服务端B转发到服务端C,但是服务器B内存只有1个g, 怎么去实现这个大文件转存
- 分片+stream传输,维护一个分片列表
- 断点续传 + 文件秒传
- 抽样计算整个文件 hash,防止文件重复,为了文件秒传做基础
- 分片都传输成功后,以追加方式合并流文件
# 如何实现内网穿透,端口转发了解一下
ssh 隧道,内网穿透
# 如何劫持https的请求,提供思路
模拟中间人攻击
# 前端如何进行seo优化
- 合理的title、description、keywords:搜索对着三项的权重逐个减小,title值强调重点即可;description把页面内容高度概括,不可过分堆砌关键词;keywords列举出重要关键词。
- 语义化的HTML代码,符合W3C规范:语义化代码让搜索引擎容易理解网页
- 重要内容HTML代码放在最前:搜索引擎抓取HTML顺序是从上到下,保证重要内容一定会被抓取
- 重要内容不要用js输出:爬虫不会执行js获取内容
- 少用iframe:搜索引擎不会抓取iframe中的内容
- 非装饰性图片必须加alt
- 提高网站速度:网站速度是搜索引擎排序的一个重要指标
# 2万小球问题:在浏览器端,用js存储2万个小球的信息,包含小球的大小,位置,颜色等,如何做到对这2万条小球信息进行最优检索和存储
- 用ArrayBuffer实现极致存储
- 哈夫曼编码 + 字典查询树实现更优索引
- 用bit-map实现大数据筛查
- 用hash索引实现简单快捷的检索
- 用IndexedDB实现动态存储扩充浏览器端虚拟容量
- 用iframe的漏洞实现浏览器端localStorage无限存储,实现2千万小球信息存储
# 如何尽可能流畅的实现这2万小球在浏览器中,以直线运动的动效显示出来
- 使用GPU硬件加速
- 使用webGL
- 使用assembly辅助计算,然后在浏览器端控制动画帧频
- 用web worker实现javascript多线程,分块处理小球
- 用单链表树算法和携程机制,实现任务动态分割和任务暂停、恢复、回滚,动态渲染和处理小球
# 100亿排序问题:内存不足,一次只允许你装载和操作1亿条数据,如何对100亿条数据进行排序
第八题拆成几百份数据存文件(100份肯定不够要给程序变量留内存),然后多路归并(外部排序)
# 请设计一个攻击服务器的策略
- DDOS
- ARP攻击
- CC攻击,
- SYN攻击,
- ping死他,
- 刷接口
- 域名劫持
- 给他的服务器植入木马
# 十万条数据插入数据库,怎么去优化和处理高并发情况下的DB插入
# 如果让你搭建一套前端监控方案,具体思路
# 100 * 100 的 Canvas 占内存多大?
RGBA表示颜色 每一个位颜色使用1个字节,100*100*4
40000字节大概 = 39KB
# 如何获取一个 0 ~ 5的随机整数,95 ~ 100呢
思路
Math.random() 获取的是一个 0~1之间的小数
Math.random(); //0.8961082300942438
Math.random(); //0.009676286758744546
Math.random(); //0.7722302289555816
Math.random() * 2 //得到 0.0000...02 ~ 1.9999...98之间的小数
Math.random() * 10 //得到 0 ~ 10之间的小数
Math.floor(Math.random() * 10) //得到 0 ~ 9(包括9) 之间的整数
Math.floor(Math.random() * 6) + 95 //得到 95 ~ 100(包括100) 之间的整数