# 程序设计

# 基于 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) 之间的整数
陕ICP备20004732号-3