字节跳动一面记录

604 阅读4分钟
  1. react生命周期

    • 挂载阶段
      • constructor
      • getDerivedStateFromProps
      • render
      • componentDidMount
    • 更新阶段
      • getDerivedStateFromProps
      • shouldComponentUpdate
      • render
      • getSnapshotBeforeUpdate // 更新前快照, 它使得组件能在发生更改之前从 DOM 中捕获一些信息, 返回值将作为componentDidUpdate的第三个参数
      • componentDidUpdate
    • 移除
      • componentWillUnmount
  2. 你刚刚有提到 getDerivedStateFromProps,说一说为什么会有这个生命周期的出现,react设计它的意义在哪里

    • state 的值任何时候都取决于 props
  3. 有用过ref吗,说一下什么是ref

    • ref 提供一种允许访问DOM节点的方法, 脱离父子通信, 可以在数据流之外强行修改子组件。通常用来管理焦点,触发强制动画, 集成第三方的库
    • ref 属性用于html元素时, 所创建的 ref 接收底层 DOM 元素作为其 current 属性
    • ref 为class的时候, ref 接受组件的挂载实例作为其current的值
    • 不能在函数组件上使用 ref 属性,因为函数组件没有实例。
  4. 有用 ref 传过参数吗, 比如传入一个函数

    • 函数的第一个参数就是被ref的DOM, 函数组件可以用useCallBack包裹这个函数
  5. useRef 的返回值是什么

    • 一个可变的 ref 对象, 其中.current属性被初始化为传入的参数。 useRef不仅可以用于dom refs, 「ref」 对象是一个 current 属性可变且可以容纳任意值的通用容器,类似于一个 class 的实例属性。
  6. 请为所有数组对象添加一个findDuplicate(n)方法,用于返回该数组中出现频率>=n的元素列表

    • Object.entries()/ Map.entries() 返回一个 Iterator 对象, 它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。
  7. 我看到你有用map ,你说下map出现的原因是什么,它和对象有什么区别

    • Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。不过 Maps 和 Objects 有一些重要的区别,在下列情况里使用 Map 会是更好的选择:

    • 一个Object的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。 Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。 你可以通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。 Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代。 Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。 Map 在涉及频繁增删键值对的场景下会有些性能优势。

  8. weakMap呢, 它有什么应用场景吗

    • 在 JavaScript 里,map API 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。给这种 map 设置值时会同时将键和值添加到这两个数组的末尾。从而使得键和值的索引在两个数组中相对应。当从该 map 取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。

    • 但这样的实现会有两个很大的缺点,首先赋值和搜索操作都是 O(n) 的时间复杂度( n 是键值对的个数),因为这两个操作都需要遍历全部整个数组来进行匹配。另外一个缺点是可能会导致内存泄漏,因为数组会一直引用着每个键和值。这种引用使得垃圾回收算法不能回收处理他们,即使没有其他任何引用存在了。

    • 相比之下,原生的 WeakMap 持有的是每个键对象的“弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行。原生 WeakMap 的结构是特殊且有效的,其用于映射的 key 只有在其没有被回收时才是有效的。

    • 正由于这样的弱引用,WeakMap 的 key 是不可枚举的 (没有方法能给出所有的 key)。如果key 是可枚举的话,其列表将会受垃圾回收机制的影响,从而得到不确定的结果。因此,如果你想要这种类型对象的 key 值的列表,你应该使用 Map。

  9. 箭头函数中的 this 指谁

  10. 如何确定函数执行时的this 指向

  11. call 和 apply 的区别

  12. 回答一下 fn.bind(obj1).apply(obj2) 中的this指谁

  13. 请你写一下bind函数的实现

  14. 说一下http常见响应头中包含了啥

    • Allow / Content-Encoding/ Content-Length/ Content-Type/ Date/ Expires/ Last-Modified/ Location/ Refresh/ status/
  15. git 常用命令

  16. rebase 和 merge 的区别