大家好,我是梅巴哥er
。今天又是元气满满的一天哦~
1,问:js垃圾回收机制
答:
- 垃圾
- 变量没有被引用,并没有清除,这个变量就是垃圾。
- 例外:如果几个变量互相引用,形成一个环,而且访问不到它们,这些变量也会被当作垃圾清除掉。
- 垃圾回收
- 引用计数法
- 从声明变量时,就记录变量被引用次数。如果变量引用次数是0,则会被清除
- 标记清除法
- 标记阶段:从根节点出发,把所有活动对象及其及对象,都打上标记
- 清除阶段:遍历堆,把未被标记的对象,清除掉
- 手动清除
- 不再引用的变量,设置为
null
- 不再引用的变量,设置为
- 引用计数法
2,问:http缓存
答:
- 分类
- 强缓存
- 协商缓存
- 怎么理解缓存机制?
- 浏览器相当于要开灯的你
- 你要开灯,要先去看看灯座上有没有好用的灯(先查看缓存)。有就打开,没有,就下一步。
- 灯座上的灯没打开(缓存中没找到),所以你让电工(服务器)来给看看灯泡有没有坏(失效)。
- 电工说,你家灯坏了,不能用了。
- 然后你说,电工你给我拿个灯来吧(向服务器请求数据)。
- 强缓存用到的属性
- Expires:一个确定的过期时间。如果直接把客户端时间改掉,会影响缓存。
- Cache-Control:max-Age:一个相对的过期时间,单位是秒。更改客户端时间,不会影响缓存时间。比Expires优先级高。
- 另一个值:no-cache :意思是强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。不是字面意思上的不缓存。
- 再一个值:no-store:真正意义上的禁止缓存,每次请求都要向服务器重新获取数据。
- 协商缓存用到的属性
- Last-Modify/If-Modify-Sinc:前者是第一次请求返回到响应头的属性,后者是后续请求显示在请求头的属性
- ETag/If-None-Match:同样是一个在响应头,一个在请求头。
- 用户的操作对缓存的影响
3,问:排序算法有哪些
答:
- 冒泡排序:比较相邻元素,然后交换位置
- 选择排序:先找出一最小值放在1号位,然后在剩下的数字中再找出最小值,放在2号位。以此类推。
- 插入排序:比如无序数列[4,3,6,2,9,5]。把[4]和[3,6,2,9,5]分开。把3拿出来,和4比较,3比4小,然后把3插入到4的前面,然后两个数列变成了[3,4]和[6,2,9,5]。继续拿出6和[3,4]的数字比较,6比4大,所以6插入到4的后面。两个数列就变成了[3,4,6]和[2,9,5]。继续拿出2和[3,4,6]中的数字比较,2最小,所以2插入到3的前面。依次类推,最后得出排序结果[2,3,4,5,6,9]
- 希尔排序。改进版的插入排序。核心在于分组数。
- 快速排序:核心是基准数的真实位置就是low和high重叠的位置
4,问:redux数据流,react-redux,图解一下
答:
- 下面这个是
redux
的:
(用画图工具画的,有点别扭,凑合看吧23333)
- 带上
react-redux
,就是下面这样了:
5,问:connect是怎么实现的
答:
connect(reducer管理的状态, action函数)(连接的组件)
6,问:js字符串的常用api
答:
var str=' abca '
// str的元素个数
console.log(str.length) // 6
// 查找某字符首次出现的下标,没有则返回-1
console.log(str.indexOf('a'), str.indexOf('d')) // 1 -1
// 查找某字符最后一次出现的下标,没有则返回-1
console.log(str.lastIndexOf('a'), str.lastIndexOf('d')) // 4, -1
// 按下标截取字符 slice(start, end), substring(start, end)
console.log(str.slice(1, 3), str.substring(1, 3)) // ab ab
// 按个数截取字符substr(start, length)
console.log(str.substr(1, 2)) // ab
// 替换replace('b', 'd')
console.log(str.replace('b', 'd')) // ' adca '
// 去除两端空格 ie8及以下版本不支持trim()
console.log(str.trim()) // 'abca'
// 转换成数组
console.log(str.split('')) // [ ' ', 'a', 'b', 'c', 'a', ' ' ]
7,问:箭头函数有原型吗?
答:
var fn = () => {}
console.log(fn.prototype) // undefined
console.log(fn.__proto__) // [Function]
function fn1(){}
console.log(fn1.prototype) // fn1 {}
console.log(fn1.__proto__) // [Function]
8,问:setTimeout的执行机制,他在设定的秒数后就一定能执行吗
答:
- 不一定执行。
// 举个例子
setTimeout(function() {
console.log("计时器执行")
}, 0)
for (var i = 0; i < 1000000000; i++) {
if (i == 999999999) {
console.log(i);
}
}
- 上面的代码,虽然我们给定时器设置的时间是0ms后执行,但是实际上代码在等待大概1s多后才输出结果。
- 原因是js的执行机制。for是同步任务,进入主线程先执行,待for执行完后,才会让定时器从等待队列进入到主线程执行。
9,问:BOM是什么
答:
-
BOM即浏览器对象模型(browser object model),主要作用对象就是window。
-
包含哪些操作方法?
- location对象
重载:location.reload(); 跳转页面:location.href location.assign() location.replace() 区别:location.href除了跳转页面,还可以获取当前页面的网址,有历史记录; location.assign()只能跳转页面,有历史记录; location.replace()替换当前页面,也是跳转页面,没有历史记录。 location.hash:获取地址栏中#后面的内容,也就是锚点标记名 location.search:获取地址栏中?后面的内容,?号后面一般是访问地址的参数 location.pathname:地址栏中文件路径和名称; location.port:地址栏中的端口号; location.protocol:地址栏中的协议; location.hostname:地址栏中的域名;
- history对象
history.back():回退 history.forward():前进 history.go(1):跳转到第几个负数是回退,正式是前进,0是刷新页面;
- navigator对象
用户浏览器信息:navigator.userAgent;
以上。