No164.精选前端面试题,享受每天的挑战和学习

简介: No164.精选前端面试题,享受每天的挑战和学习

symbol

Symbol是JavaScript中的一种原始数据类型(Primitive data type),引入于ES6标准。Symbol表示一个独一无二的标识符(identifier),用于对象属性的命名或其他用途。

下面是Symbol的一些特点和用法:

  1. 独一无二性:每个通过Symbol函数创建的Symbol值都是唯一的,不会重复。即使创建时传入相同的参数,得到的Symbol值也是不同的。
  2. 不可变性:Symbol值是不可变的,无法修改。这意味着它们是作为对象属性的标识符时,可以确保属性名的唯一性。
  3. 作为属性名:Symbol可以用作对象的属性名,通过Symbol作为键,创建的属性不会出现命名冲突的问题。
const mySymbol = Symbol();
const obj = {
  [mySymbol]: 'Hello Symbol!'
};
console.log(obj[mySymbol]);  // Hello Symbol!
  1. 隐藏属性:由于Symbol值的唯一性和不可变性,可以将某些属性设置为使用Symbol作为键,使其不容易被意外修改或访问。这在定义一些特殊用途的内部属性时很有用。
  2. 预定义Symbol:JavaScript语言内部已经定义了一些预定义的Symbol,如Symbol.iteratorSymbol.toStringTag等,它们具有特定的含义和用途。

Symbol是一种非常有用的特性,它增加了更多的语言表达能力和灵活性,特别在避免属性名冲突和定义隐藏属性时非常有用。但由于其独特的特性,使用Symbol也需要谨慎,确保正确理解其用途和行为。

useRef / ref / forwardsRef 的区别是什么?

在React中,useRefrefforwardRef是用于处理引用(ref)的三个相关概念和技术。

  1. useRef: useRef是React提供的一个钩子函数,用于在函数组件中创建可变的引用。useRef返回一个可变的ref对象,该对象的current属性可以持有并跟踪一个值,在组件重新渲染时保持不变。useRef通常用于保存和访问组件中的DOM节点、持久化数据或其他可变值。
  2. ref: ref是React提供的一个属性,用于在类组件中创建引用。通过在一个组件上添加ref属性并为其赋值,可以创建对组件实例或DOM节点的引用。通过ref.current可以访问引用的值。ref通常用于访问组件的实例、控制焦点、触发DOM操作等。
  3. forwardRef: forwardRef是React提供的API之一,用于在组件之间转发引用。它允许一个组件向其子组件传递引用,以便子组件可以操作父组件或其他组件的DOM节点。forwardRef函数接受一个组件,并返回一个新的组件,该新组件可以接收ref属性。使用forwardRef可以将ref通过组件树层级进行传递。

区别总结如下:

  • useRef是一个钩子函数,在函数组件中用于创建可变引用。
  • ref是一个属性,在类组件中用于创建引用。
  • useRefref的本质都是为了创建和访问引用值,但用法和语法不同。
  • forwardRef是一个API,用于在组件之间转发引用,特别是在使用函数组件时。
  • forwardRef结合ref一起使用,使得引用可以在组件树中向下传递。

需要注意的是,useRefref创建的引用在更新时不会引起组件重新渲染,但使用引用的值可能会影响组件的渲染结果。forwardRef允许引用在组件树中传递,但不会触发任何默认的引用行为。

useEffect 的第二个参数, 传空数组和传依赖数组有什么区别?

useEffect是React提供的一个钩子函数,用于处理组件副作用(side effects),比如数据获取、订阅更新、DOM操作等。useEffect接受两个参数:一个effect函数和一个依赖数组。

  1. 传空数组:如果将空数组作为useEffect的第二个参数,即useEffect(effect, []),则表明该effect不依赖于任何props或state。这意味着该effect仅在组件挂载时(初始化)运行一次,并在组件卸载时清除。它不会再在组件的重新渲染时被调用。
useEffect(() => {
  // 这个effect只在组件挂载时运行一次
  // 在组件卸载时清除effect
  // 不依赖任何props或state
  // 在后续重新渲染时不会再被调用
  // ...
}, []);
  1. 使用空数组作为依赖数组的useEffect常用于只需要在组件挂载和卸载时进行一次性操作的场景,例如订阅和取消订阅事件、初始化一些数据等。
  2. 传依赖数组:如果在useEffect的第二个参数中传递一个包含依赖项的数组,即useEffect(effect, [dependency1, dependency2]),则表明该effect的执行依赖于指定的变量。只有当依赖项发生变化时,该effect才会被调用。
useEffect(() => {
  // 这个effect在组件挂载时运行,以及依赖项发生变化时重新运行
  // 在组件卸载时清除effect
  // 依赖dependency1和dependency2
  // ...
}, [dependency1, dependency2]);
  1. 传递依赖项的数组告诉React只有当这些依赖项之一发生变化时,才重新运行effect。这允许effect对特定状态或props的更改做出反应,并在需要时进行相应的操作。

总结区别如下:

  • 传空数组作为依赖数组:effect仅在组件挂载时运行一次,并在组件卸载时清除。不依赖props或state,不重新运行。
  • 传递依赖项的数组:effect在组件挂载时运行一次,并在依赖项发生变化时重新运行。在组件卸载时清除effect。

如果 return 了一个函数, 传空数组的话是在什么时候执行? 传依赖数组的时候是在什么时候执行?

当在useEffect中返回一个函数时,该函数被称为“清除函数”(cleanup function)。清除函数的执行时机与传递的依赖数组有关。

  1. 传空数组:如果将空数组作为依赖数组,即useEffect(effect, []),则清除函数只会在组件卸载时执行。
useEffect(() => {
  // effect的逻辑...
  return () => {
    // 清除函数,只在组件卸载时执行
    // ...
  };
}, []);
  1. 当传递空数组时,effect函数只在组件挂载时调用一次,并在组件卸载时执行清除函数。这种情况下,清除函数仅被用来取消订阅、清理计时器、释放资源等在组件卸载时需要进行的操作。
  2. 传递依赖项的数组:如果传递一个包含依赖项的数组,即useEffect(effect, [dependency1, dependency2]),则清除函数会在下一次effect运行之前执行,当依赖项发生变化时重新运行effect,或在组件卸载时执行。
useEffect(() => {
  // effect的逻辑...
  return () => {
    // 清除函数,在下一次effect执行之前执行
    // 或在组件卸载时执行
    // ...
  };
}, [dependency1, dependency2]);
  1. 当依赖项发生变化时,React会在再次运行effect之前执行清除函数。这使得我们可以在effect执行之前清理和准备一些内容,以确保我们得到最新的状态。当组件卸载时,清除函数同样会被执行。

总结执行时机如下:

  • 传空数组:清除函数只在组件卸载时执行。
  • 传递依赖项的数组:清除函数在下一次effect执行之前执行(当依赖项发生变化时),或在组件卸载时执行。
相关文章
|
27天前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
48 5
|
1月前
|
移动开发 前端开发 JavaScript
从零开始学习前端开发:入门指南
本文将介绍从零开始学习前端开发的入门指南。通过学习HTML、CSS和JavaScript等基础知识,读者将了解前端开发的基本概念和工具,并学会如何构建简单的网页应用程序。无论您是初学者还是有一定经验的开发人员,本文都将帮助您打下坚实的前端开发基础。
|
3月前
|
存储 开发框架 前端开发
从零开始学习前端开发
前端开发是现代互联网应用程序开发中不可或缺的一部分。本文将带您从零开始学习前端开发,包括HTML、CSS和JavaScript等核心技术,以及常见的开发框架和工具。
|
3天前
|
存储 移动开发 JavaScript
学习javascript,前端知识精讲,助力你轻松掌握
学习javascript,前端知识精讲,助力你轻松掌握
|
4天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
27天前
|
前端开发 JavaScript Java
通过学习mayfly,我学会了前端如何优雅设计字典值
`shigen`是一位擅长多种编程语言的博主,他在探索[mayfly-go](https://juejin.cn/post/7319365035552309248)项目后,发现了对枚举值管理的优雅设计。他分享了如何将字典和枚举值结构化,使用Vue+typescript实现更易维护的代码。通过创建`TagType`和`EnumValue`类,以及提供静态方法,实现了模块化和简洁的字典处理。示例展示了如何在页面中高效引用和显示字典数据,提高了代码的可读性和可维护性。
18 3
通过学习mayfly,我学会了前端如何优雅设计字典值
|
2月前
|
存储 缓存 监控
2024年春招小红书前端实习面试题分享
春招已经拉开帷幕啦! 春招的拉开,意味着新一轮的求职大战已经打响,希望每位求职者都能充分准备,以最佳的状态迎接挑战,找到心仪的工作,开启职业生涯的新篇章。祝愿每位求职者都能收获满满,前程似锦!
77 3
|
2月前
|
前端开发 数据可视化 安全
2024金三银四必看前端面试题!简答版精品!
2024金三银四必看前端面试题!2w字精品!简答版 金三银四黄金期来了 想要跳槽的小伙伴快来看啊
89 3
|
2月前
|
网络协议
跟着动画学习TCP三次握手和四次挥手,及全部面试题
跟着动画学习TCP三次握手和四次挥手,及全部面试题
36 0
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
98 0