2024年7月面试记录

108 阅读6分钟

公司: 壹立科技

1. apply call bind 作用是什么,区别是什么

相同点: aplly call bind都是用来改变this指向的方式。

不同点:

  • 执行方式不同:
    • call apply都是同步代码,会立即执行函数并改变this的指向。
    • bind 不会立即执行函数,它会返回一个新的函数,这个新函数在调用时会持有bind方法中被绑定的this值
  • 参数传递方式不同:
    • call bind 是通过参数列表传入参数,需要逐个传入,不能使用剩余参数的方式传参。
    • appply 可以通过数组的方式传入参数,支持剩余参数的方式传入。
  • 修改this的性质不同:
    • call apply只是临时修改一次this的指向,当再次调用原函数时,它的指向还是原来的指向。
    • bind 是永久修改函数this指向,它返回一个新的函数,此函数的this永远被改变了,绑定就无法修改。

2. Promise 有哪几种状态? 这些状态可不可以被改变

三种状态: pending fulfilled rejected (未决定,履行, 拒绝)

同一时间只能存在一种状态,且状态一旦改变就不能再变。

3. 哪些是宏任务、微任务? .then 是宏任务还是微任务

  • 宏任务: script(理解为外层同步代码)、setTimeout/setInterval、postMessage、setImmediate
  • 微任务: Promise.then()、await后面的代码、MutationObserver、proxy、process.nextTick

4. 作用域有哪些?for if是不是作用域

常见的作用域分为:全局作用域(global\window)、函数作用域(局部作用域)(function)、块级作用域({})

if语句和for语句的{}属于块作用域,const let是块级作用域

var、let、const的比较 1.var定义的变量,全局作用域或局部作用域,可以跨块访问,不能块函数访问,可能存在变量提升。 2.let定义的变量,块作用域,只能在块中使用,不能跨块跨函数访问,在定义之前,不能被访问,不存在变量提升。 3.const基本同let,只不过定义的是常量,不能被修改,不可以重复声明。

5. 闭包在什么情况下会造成内存泄漏

  • 闭包内部引用了全局变量:如果闭包内部引用了全局变量,并且没有在适当的时候清理对这个全局变量的引用,那么全局变量就会一直存在内存中,直到程序结束。这会导致全局变量的内存无法被回收,从而造成内存泄漏。
  • 闭包内部引用了不可清理的对象:如果闭包内部引用了例如闭包本身、函数、DOM节点等不可清理的对象,那么这些对象就会一直存在内存中,直到程序结束,因为这些对象无法被垃圾回收机制回收,所以会导致内存泄漏。
  • 无线循环和递归调用:当一个闭包在内部引用外部变量,并且这个闭包又被外部的代码反复调用时,就可能导致内存泄漏,这是因为每次调用都会在内存中创建一个新的作用域,并且这个作用域不会被垃圾回收机制清理
  • 被遗忘的计时器或回调函数;如果某个DOM元素在JavaScript中持续引用,当从DOM树中移除时,如果JS中的引用没有被及时清理,那么该DOM元素的生命周期将由JS和是否在DOM树上两者决定。如果未及时移除这些引用,就会导致内存溢出。此外,如果设置了setTimeout 或 setInterval 但没有及时清除(使用clearTimeout 或 clearInterval),也会导致内存泄漏。

6. react中的Context(上下文)是用来做什么的

React的context提供了一种无需为每层组件手动添加props的方法,‌能够在组件树之间共享指定的值。‌这种方式特别适用于那些需要在应用程序的许多组件中共享的数据,‌如地区偏好、‌UI主题等。‌通过context,‌父组件可以向其下面的整个组件树提供数据,‌而无需显式地通过组件树的逐层传递props。‌这种机制允许跨层级的通信,‌使得数据的传递更加灵活和高效。‌

7. object.assign是深拷贝还是浅拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝;但是对象中二级属性的时候,此方法就是浅拷贝。

深拷贝: 1、JSON.parse(JSON.stringify()), 如果对象中包含function或regexp就不能使用 2、递归方式 3、lodash函数库

公司: 掌梦科技

1. React常用的hook

image.png

2. 对于高阶组件的理解及其使用场景

  • 接收一个或多个函数组件作为输入
  • 输出函数组件
  • props保持一致
  • 不能以任何方式改变原始组件
  • 不能在render()方法中使用 使用场景:多个模块都需要使用这个功能,例如权限控制、数据校验、日志记录、异常处理、统计上报

3. 如何写一个自定义hook

4. useEffect如何同时等待多个变量都发生变化后再执行

  • 使用useMemo或useCallback:如果useEffect中的某些操作是计算密集型的,可以考虑使用useMemo或useCallback来缓存计算结果。这样,只有当依赖变量发生变化时,计算才会重新执行。
const memoizedValue = useMemo(() => {
  // 计算操作,依赖于变量a和b
}, [a, b]);
 
 
useEffect(() => {
  // 副作用操作,依赖于memoizedValue
}, [memoizedValue]);

公司:图达梦

1. react通信方式

  • 父传子:props
  • 子传父:回调函数,ref
  • 兄弟组件:状态提升
  • 跨层级组件:Context、Redux

2. useEffect是用来做什么的

useEffect是React中用于处理副作用操作的Hook。‌ useEffect的使用场景包括:‌

  • 数据获取:‌在组件加载时从服务器获取数据。‌
  • 订阅:‌监听某些事件或数据源的变化。‌
  • 定时器设置:‌使用setTimeout或setInterval。‌
  • 修改DOM:‌在渲染后对DOM进行操作。‌

3. useMemo useCallback是用来做什么的

useMemo和useCallback都是React中的优化工具,‌用于提高性能和减少资源浪费,减少不必要的计算或渲染。‌

  • useMemo主要用于缓存计算属性的结果。当发现依赖未发生改变时,它会返回旧的计算属性值的地址,从而避免重复计算
  • useCallback 与 useMemo类似,但它用于返回函数

4. react 生命周期 hook

React Hooks没有传统意义上的生命周期。

  • useEffect则用于执行副作用操作,‌如数据获取或DOM更新等。‌尽管它没有像类组件中的componentDidMount、‌componentDidUpdate等明确命名的生命周期方法,‌但通过配置依赖项,‌可以实现类似的效果。‌例如,‌当组件首次渲染(‌类似componentDidMount)‌或依赖项发生变化时执行特定的操作(‌类似componentDidUpdate)‌。‌

5. Jsx 与 js 区别

  • 编写方式:
    • Js是在标签中编写的,可以直接被浏览器识别和执行
    • JSX 则是在 HTML中编写的类似XML的语法,不能直接被浏览器识别,需要经过编译后才能运行。