公司: 壹立科技
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
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的语法,不能直接被浏览器识别,需要经过编译后才能运行。