# 面试笔记
ES6 新特性
forin forof
set map weakMap weakSet
xss csrf
https://www.jianshu.com/p/af78964c33e2 https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104148444
# 字节跳动
- 斐波那契 递归实现/dp 实现/空间优化
 
- 书写一个闭包
 
- 事件循环判断输出顺序(async/ promise / setTimeout)
 
- 进程线程区别
 
- http 状态码/重定向
 
- 两个不均匀的香 一个烧完 1 个小时,如何计算 15 分钟
 
- 虚拟 dom 原理
 
- vue 数据劫持
 
- 深拷贝
 
- css 选择器
 
- css 权重问题
 
- 层次遍历一个树
 
- http 状态码
 
- 强缓存/协商缓存
 
- Etag 生成的原理
 
- vue 中组件通信方法
 
- OSI 网络七层模型
 
- TCP 超时重传,滑动窗口,慢启动快重传
 
- 常见的网络攻击以及解决方法
 
- vue 中 key 的作用
 
- TCP 三次握手四次挥手
 
- 如何界定跨域
 
- cookie 属性 httponly/secure
 
- http 头部 Only 字段
 
- 找出 sum 大于大于 target 的最短连接数组的长度
 
- vue 双向绑定
 
- vue data 为什么一定是函数
 
- 没有 data 中注册为什么不能视图更新
 
- 如果非想不注册就得到数据更新,怎么办
 
- 64 匹马,8 个赛道,决出最快的四匹马
 
- 虚拟 dom diff 算法原理 复杂度
 
- css 提升性能的方式
 
- 浏览器进程线程
 
- https 原理
 
- localstorage 存储数据格式和 sessionStorage 区别
 
- indexDB
 
# - pg01
+(function() {
  alert(a); // 1. function a(){alert(2)}
  a();
  var a = function() {
    alert(1); // 4. 1
  };
  function a() {
    alert(2); // 2. 2
  }
  alert(a); // 3. function (){alert(1)}
  a();
  var d = a;
  var c = d; // error
})();
alert(d); //erroe
alert(c);
考点:
- IIFE->匿名自执行函数,此时创建闭包
 
- 函数的提升比变量要前
 
- 作用域和连等问题
 
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 }; // !=   a={n:2}  a.x=a;   此时的 a 是 undifined变量
alert(a.x); // undefined  1. a={n:2}  2. a.x = a;
alert(b.x); // {n:2}
this.a = 20;
var test = {
  a: 40,
  init: () => {
    console.log(this.a);
    function go() {
      console.log(this.a);
    }
    go.prototype.a = 50;
    return go;
  },
};
new (test.init())();
考点:
- this 的指向问题,this 只有执行的时候才能确认下来,谁调用,就指向谁,没人调用就指向 window
- 当函数当做构造函数的时候,原型链里 this 对属性的赋值要低于函数内部指向
# - pg2
如何正确输出 li 里的值
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>
<script type="text/javascript">
  var list_li = document.getElementsByTagName("li");
  for (var i = 0; i < list_li.length; i++) {
    list_li[i].onclick = function() {
      console.log(i);
    };
  }
</script>
- 闭包解决:函数作为返回值、函数作为参数传递,保护变量。【内存泄露可以把参数置空】
 
var list_li = document.getElementsByTagName("li");
for (var i = 0; i < list_li.length; i++) {
  list_li[i].onclick = (function(i) {
    return function() {
      console.log(i);
    };
    i = null;
  })(i);
}
- 块级作用域和全局作用域,使用 let
 
var list_li = document.getElementsByTagName("li");
for (let i = 0; i < list_li.length; i++) {
  list_li[i].onclick = function() {
    console.log(i);
  };
}
- this.innerHTML
 
var list_li = document.getElementsByTagName("li");
for (var i = 0; i < list_li.length; i++) {
  list_li[i].onclick = function() {
    console.log(this.innerHTML);
  };
}
# for in 和 for of 的区别
- for..of