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

news2024/11/27 14:35:16

在这里插入图片描述

文章目录

    • JS数组去重的几个方法
    • 讲下es6新增symbol 数据类型
    • v-model原理是什么
    • vue响应式原理
    • vue中的data 为什么是个函数?
    • 前端有几种缓存方式

JS数组去重的几个方法

在JavaScript中,可以使用几种方法对数组进行去重:

  1. 使用Set:Set是ES6中引入的数据结构,它可以存储唯一值。我们可以将数组转换为Set,然后再将其转回数组,这样就实现了去重。
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]
  1. 使用filter()方法:可以使用数组的filter()方法筛选出唯一的元素。
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((value, index, self) => {
  return self.indexOf(value) === index;
});
console.log(uniqueArray); // [1, 2, 3, 4, 5]
  1. 使用reduce()方法:可以使用数组的reduce()方法来逐个比较元素并创建新的数组。
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((prev, curr) => {
  if (!prev.includes(curr)) {
    prev.push(curr);
  }
  return prev;
}, []);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

这些都是常见的数组去重方法,可以根据自己的需求选择合适的方法。

讲下es6新增symbol 数据类型

ES6中引入了一种新的原始数据类型,即Symbol(符号)。Symbol是一种唯一且不可变的数据类型,它可以用作对象属性的标识符。

创建Symbol对象可以使用全局Symbol函数,并且可以传递一个可选的描述参数。

以下是一些关于Symbol的特点和用法:

  1. Symbol的唯一性:每个通过Symbol函数创建的Symbol值都是唯一的,即使它们的描述相同。
const symbol1 = Symbol('foo');
const symbol2 = Symbol('foo');

console.log(symbol1 === symbol2); // false
  1. Symbol作为属性标识符:可以将Symbol作为对象属性名来避免命名冲突。
const obj = {
  [Symbol('name')]: 'Alice',
  [Symbol('name')]: 'Bob'
};

console.log(obj); // {Symbol(name): 'Alice', Symbol(name): 'Bob'}
  1. 遍历Symbol属性:使用Object.getOwnPropertySymbols()方法可以获取对象中的所有Symbol属性。
const obj = {
  [Symbol('name')]: 'Alice',
  [Symbol('age')]: 25,
  gender: 'female'
};

const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // [Symbol(name), Symbol(age)]
  1. 使用内置的Symbol值:ES6提供了一些内置的Symbol值,用于表示特殊行为或元信息。例如,Symbol.iterator表示对象是否可迭代,Symbol.hasInstance表示对象是否为某个构造器的实例等。
const arr = [1, 2, 3];
console.log(arr[Symbol.iterator]); // function values() { ... }

const obj = {};
console.log(obj[Symbol.hasInstance]); // function [Symbol.hasInstance](value) { ... }

Symbol是一种非常有用的数据类型,它可以用于创建唯一的属性名、避免命名冲突,并且可以与其他数据类型一起使用。

v-model原理是什么

v-model是Vue.js框架中的一个指令,用于实现表单元素与数据双向绑定。当使用v-model指令时,它会在表单元素上创建一个属性绑定,将表单元素的值与指定的数据属性进行双向绑定。

下面是v-model的原理:

  1. 根据指令的参数(通常是一个变量),Vue会将一个value属性和一个input事件添加到与指令绑定的表单元素上。

  2. 当表单元素的值发生变化时,会触发input事件。

  3. input事件被触发时,Vue会通过该事件获取到最新的值,并将其赋值给指定的数据属性。

  4. 同时,Vue还会在绑定的表单元素上设置初始值,将数据属性的值反映到表单元素上。

  5. 当数据属性的值改变时,由于双向绑定的机制,表单元素的值也会自动更新。

通过以上步骤,v-model指令实现了表单元素与指定数据属性之间的双向绑定,使得数据的更新能够立即反映到用户界面,同时用户界面上的变化也能同步更新到数据模型中。

需要注意的是,v-model指令并非只适用于表单输入元素(如inputselecttextarea),还可以用于自定义组件中,但前提是该组件要实现对应的value属性和input事件。

总结而言,通过v-model指令,Vue.js框架能够简化表单元素与数据绑定的操作,提高开发效率。

vue响应式原理

Vue.js的响应式原理是通过使用JavaScript的Object.defineProperty方法来劫持对象的属性访问,从而实现数据的变化检测和视图更新。

以下是Vue.js的响应式原理的核心步骤:

  1. 数据初始化:在Vue实例的创建过程中,Vue会对data属性中的每个属性进行遍历,并使用Object.defineProperty将其转换为“响应式”的属性。

  2. 对象属性劫持:对于每个属性,Vue会为其创建一个监听器Dep(依赖),用来收集订阅该属性变化的Watcher(观察者)。

    • 当代码访问该属性时,会触发监听器Dep的depend方法,用来收集依赖该属性的Watcher。
    • 当属性发生变化时,会触发监听器Dep的notify方法,通知所有依赖该属性的Watcher进行更新。
  3. 视图渲染:Vue通过模板编译将模板转换为Render函数,并生成虚拟DOM树(VNode)。当数据发生变化时,Watcher会触发重新渲染视图的操作。

  4. 数据劫持:当触发数据的set操作时,Vue会通过监听器Dep的notify方法通知所有依赖该属性的Watcher进行更新。

  5. 视图更新:Watcher接收到通知后,会调用对应的更新函数,在更新函数中重新生成虚拟DOM树,并通过比对算法(Diff算法)找出变化的部分,然后将变化的部分进行更新。

通过以上步骤,Vue.js实现了数据与视图之间的双向绑定和自动更新。当数据发生变化时,自动触发视图的更新,当视图中的交互操作改变了数据时,也会同步更新到数据源。这让开发者能够以更直观、简洁的方式编写代码,并提升了开发效率。

vue中的data 为什么是个函数?

在Vue中,data选项可以是一个函数或一个对象。通常情况下,推荐将data定义为一个函数。

data被定义为一个函数的主要原因是为了保证每个组件实例都能拥有独立的数据副本,而不是共享同一个数据引用。当data选项是一个对象时,所有组件实例会共享同一个data对象,这可能导致状态的交叉污染和数据共享问题。

data定义为一个函数可以解决这个问题,每次创建组件实例时,Vue会调用该函数来获取真实的数据对象,确保每个组件实例都拥有独立的数据副本。这样做的好处是,每个组件实例的数据都是相互隔离的,互不影响。

示例:

data() {
  return {
    message: 'Hello Vue!'
  };
}

通过将data定义为函数,每个组件实例引用的都是一个全新的数据对象,确保了数据的独立性和封装性。

总结而言,将data定义为函数的作用是为了确保每个组件实例拥有独立的数据,避免状态污染和数据共享问题,提高了组件的可复用性和封装性。

前端有几种缓存方式

在前端开发中,常见的几种缓存方式有以下几种:

  1. 浏览器缓存:浏览器缓存是指浏览器在加载网页时将一些资源(如CSS、JavaScript、图片等)保存到本地磁盘中,下次再加载同样的资源时可以直接使用本地缓存而不需要重新下载。可以通过设置响应头中的Cache-ControlExpires等字段来控制浏览器缓存的策略。

  2. HTTP 缓存:HTTP 缓存是通过在网络请求和响应的过程中添加特定的头部字段来实现的。常见的 HTTP 缓存头部字段有ETagIf-None-MatchLast-ModifiedIf-Modified-Since等。通过合理设置这些头部字段,可以使浏览器和服务器之间进行缓存控制,从而减少重复请求和数据传输。

  3. Service Worker 缓存:Service Worker 是运行在浏览器后台的脚本,可以拦截和处理网络请求。通过使用 Service Worker,可以实现离线缓存和自定义缓存策略。开发者可以通过在 Service Worker 中缓存需要的资源,使得在离线状态下仍然能够访问网页内容。

  4. Web Storage:Web Storage 是 HTML5 提供的一种浏览器缓存方式,包括了 localStorage 和 sessionStorage 两种机制。localStorage 可以用来存储大量的数据,并且会一直保存在客户端,除非主动清除或者过期。sessionStorage 只在当前会话(浏览器标签页)中有效,关闭标签页后数据会被清除。

  5. 内存缓存:内存缓存通常是指将数据存储在内存中,例如在 JavaScript 中使用变量、对象、数组等来保存数据,这样能够快速读取和操作数据,但页面刷新或关闭后缓存数据会被清除。

需要根据具体的需求和场景选择适合的缓存策略,以提高用户体验和性能。不同的缓存方式可以相互结合使用,共同发挥作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日汇评:美联储会议纪要是否能确认黄金的看涨楔形?

1、在美国独立日清淡的交易中,黄金价格创下了一周以来的新高; 2、在美联储会议纪要之前,美元利用了对经济衰退的担忧和中美科技之争; 3、黄金需要日线收在1922美元上方才能确认看涨楔形,但看跌的RSI值得谨慎&#xf…

png转svg图片免费

svg免费转换网站 https://vectr.com/design/editor/c232c8cb-5eb8-4bae-b302-25cb94a8f737 操作步骤 1.上传png或者其他格式图片 2.点击导出文件 3.选择导出格式为svg和其他配置参数 4.打开下载好的svg图片 5.在编辑器中看svg图片

短视频矩阵系统源码自研+开发技术文档

一、短视频矩阵系统源码自研(站在开发者交付分析) 目录 一、短视频矩阵系统源码自研(站在开发者交付分析) 二、 短视频矩阵系统需要开发的前提语言框架技巧:NGINX,PHP7.4,MySQL5.7&#xff0…

多个微信号如何管理?

很多公司都在发愁这几个问题: 1、拥有多个微信号,不想管理多台手机,想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系,安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

创作神器:探索ai智能绘画软件的魅力与功能

曾经有一个名叫小艾的年轻画家,她对绘画充满热情,并梦想创作出令人惊叹的艺术作品。然而,她发现自己在技术和创意方面遇到了一些困难。正当她感到沮丧时,她听说了一个关于智能ai绘画软件的故事,这个软件据说能够通过机…

Layui的table数据渲染不显示是怎么回事?

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼推荐系列:点击进入推荐系列…

Pycharm远程设置 DDP简单介绍

前言 最近接到一些改代码或者帮助debug的需求,大多数不是在本地而是autodl这种服务器上,有些人可能不太了解如何设置远程环境。通常在实验室一般都是在本地调好代码然后scp到服务器上去训练,不过这就需要本地有显卡能测试代码是否能跑通&…

【NX】NX二次开发设置对象高亮和颜色模板实现

在NX二次开发当中,我们经常需要高亮一个或者多个对象,或者设置对象的颜色方便实现,直接调用函数稍微显得麻烦,尤其是当我们需要处理的对象是容器的时候,于是我写了几个简单的模板实现,方便调试。 //author&…

Android Studio利用CMake生成.so文件并且可供其他项目引用

1、CMake工具 1.1、CMake是什么 CMake是一个主要用于CPP的构建工具。CMake语言是平台无关的中间编译工具。同一个CMake编译规则在不同系统平台构建出不同的可执行构建文件,所有操作都是通过编译CMakeLists.txt来完成的。在Linux产生MakeFile,在Windows…

5.1ORB-SLAM3之回环检测线程检测是否存在共视区域

1.简介 本质上是计算当前关键帧和关键帧数据库中的关键帧是否存在公共单词,相似性分数是否满足要求。 bool LoopClosing::NewDetectCommonRegions();主要包括以下几个模块: 寻找回环候选关键帧和融合候选关键帧对候选关键帧进行共视几何验证如果共视几…

Android Studio实现内容丰富的安卓校园二手交易平台(带聊天功能)

如需源码可以添加q-------3290510686,也有演示视频演示具体功能,源码不免费,尊重创作,尊重劳动。 项目编号083 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看二手商品…

AndroidStudio设置compileSdk33后xml无提示问题

这个非常蛋疼的问题遇到很多次了,AndroidStudio升级compileSdk33后无xml提示。挺久前写一个调研demo时发现了这个问题,但因为那会任务重,也没有去深入研究,就在写代码时用target32,写完打包demo时修改为33,…

附录7-用户列表案例,element-ui

目录 1 效果 1.1 查询所有用户 1.2 添加新用户 1.3 删除用户 1.4 用户详情 2 后端 2.1 查询所有 2.2 添加 2.3 删除 2.4 查询单个 3 前端 3.1 环境 3.2 main.js 3.3 userList.vue 3.4 userInfo.vue 1 效果 1.1 查询所有用户 1.2 添加新用户 …

工厂水电能耗监测系统组成

工厂水电能耗监测系统是一种用于监测工厂水电能耗的系统,可以帮助工厂管理者了解水电能耗情况,提高能源利用效率,降低生产成本。本文将从系统组成、功能、优点等方面进行介绍。 一、系统组成 工厂水电能耗监测系统由多个部分组成&#xff0c…

MySQL第一天

文章目录 作业1 简述MySQL体系结构CetenOS 7的MySQLyum在线安装CetenOS 7的MySQL的二进制方式安装 作业1 简述MySQL体系结构 MySQL是由SQL接口、解析器、优化器、缓存、储存引擎组成的,MySQL的最重要的是它的储存引擎架构,这种设计将查询处理及其系统任…

【运维工程师学习】Debian安装

【运维工程师学习】Debian安装 1、界面说明2、选择语言3、等待探测并挂载安装介质完成4、设置主机名称、用户信息5、磁盘分区6、创建分区7、最终分区为8、安装ssh9、查看ssh状态10、查看内存大小11、查询系统磁盘及分区情况12、查看各磁盘及分区剩余13、查看ip地址 选择镜像文件…

新服务器配环境

本章节的大概思路为: 1、远程连接服务器 直接远程连接,前的是你要连接的目录名称,后为服务器公网IP。 ssh xxxxxx.xxx.xxx.xxx 远程连接服务器不同端口 -p后为端口名称 ssh xxxxxx.xxx.xxx.xxx -p xxxx 之后输入密码就行了。 2、创建子用…

c语言修炼之猜数字游戏

前言 小伙伴们&#xff0c;今天来学习猜数字游戏叭&#xff01;废话不多说&#xff0c;让我们一起开始学习叭! 思路&#xff1a; 一打开游戏就出现一个菜单然后可以让我们选择是进入游戏还是退出游戏&#xff01; #include<stdio.h> void menu() {printf("*****…

详解高性能无锁队列的实现

一、无锁队列 1.1 什么是无锁队列 无锁队列&#xff08;Lock-Free Queue&#xff09;是一种并发数据结构&#xff0c;它允许多个线程在没有锁的情况下进行并发操作。 传统的队列通常通过互斥锁来实现线程安全的操作&#xff0c;但互斥锁在高并发情况下可能会造成竞争和性能瓶…

【后端面经-Java】AQS详解

【后端面经-Java】AQS详解 1. AQS是什么&#xff1f;2. AQS核心思想2.1 基本框架2.1.1 资源state2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析3.1 acquire(int)3.1.1 tryAcquire(int)3.1.2 addWaiter(Node.EXCLUSIVE)3.1.3 acquireQueued(Node node, int arg) 3.2 release(int)3…