前端高频面试题 Day03

1. Vue computed 和 watch 区别

对于Computed:

● 它支持缓存,只有依赖的数据发生了变化,才会重新计算

不支持异步,当Computed中有异步操作时,无法监听数据的变化

● computed的值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data声明过, 或者父组件传递过来的props中的数据进行计算的。

● 如果一个属性是由其他属性计算而来的,这个属性依赖其他的属性,-般会使用computed

● 如果computed属性的属性值是函数,那么默认使用get方法,函数的返回值就是属性的属性值;在computed中,属性有一个get方法和一个set方法,当数据发生变化时,会调用set方法。

对于Watch:

● 它不支持缓存,数据变化时,它就会触发相应的操作

● 支持异步监听

● 监听的函数接收两个参数,第一个参数是最新的值,第二个是变化之前的值

● 当一个属性发生变化时,就需要执行相应的操作

● 监听数据必须是data中声明的或者父组件传递过来的props中的数据, 当发生变化时,会触发其他操作,函数有两个的参数:

  1. immediate: 组件加载立即触发回调函数

  2. deep: 深度监听,发现数据内部的变化,在复杂数据类型中使用,例如数组中的对象发生变化。需要注意的是,deep无法监听到数组和对象内部的变化。

当想要执行异步或者昂贵的操作以响应不断的变化时,就需要使用watch。

总结:

●computed计算属性:依赖其它属性值,并且computed的值有缓存,只有它依赖的属性值发生改变,下一次获取computed的值时才会重新计算computed的值。

.●watch侦听器:更多的是观察的作用,无缓存性,类似于某些数据的监听回调,每当监听的数据变化时都会执行回调进行后续操作。

运用场景:

●当需要进行数值计算,并且依赖于其它数据时,应该使用computed, 因为可以利用computed的缓存特性,避免每次获取值时都要重新计算。

●当需要在数据变化时执行异步或开销较大的操作时,应该使用watch, 使用watch选项允许执行异步操作(访问一个API),限制执行该操作的频率,并在得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

2. Computed和Methods的区别

可以将同一函数定义为一个method或者一个计算属性。对于最终的结果,两种方式是相同的
不同点:
●computed:计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重新求值;
●method调用总会执行该函数。

3. for…in 和 for…of 的区别

key 和 value

for…in 遍历 key , for…of 遍历 value

const arr = [10, 20, 30]
for (let n of arr) {console.log(n)
}const str = 'abc'
for (let s of str) {console.log(s)
}
function fn() {for (let argument of arguments) {console.log(argument) // for...of 可以获取 value ,而 for...in 获取 key}
}
fn(10, 20, 30)const pList = document.querySelectorAll('p')
for (let p of pList) {console.log(p) // for...of 可以获取 value ,而 for...in 获取 key
}

遍历对象

for…in 可以遍历对象,for…of 不可以

遍历 Map/Set

for…of 可以遍历 Map/Set ,for…in 不可以

const set1 = new Set([10, 20, 30])
for (let n of set1) {console.log(n)
}let map1 = new Map([['x', 10], ['y', 20], ['z', 3]
])
for (let n of map1) {console.log(n)
}

遍历 generator

for…of 可遍历 generator ,for…in 不可以

function* foo(){yield 10yield 20yield 30
}
for (let o of foo()) {console.log(o)
}

对象的可枚举属性

for…in 遍历一个对象的可枚举属性。

使用 Object.getOwnPropertyDescriptors(obj) 可以获取对象的所有属性描述,看 enumerable: true 来判断该属性是否可枚举。

对象,数组,字符传

可迭代对象

for…of 遍历一个可迭代对象。

其实就是迭代器模式,通过一个 next 方法返回下一个元素。

该对象要实现一个 [Symbol.iterator] 方法,其中返回一个 next 函数,用于返回下一个 value(不是 key)。

可以执行 arr[Symbol.iterator]() 看一下。

JS 中内置迭代器的类型有 String Array arguments NodeList Map Set generator 等。

答案

  • for…in 遍历一个对象的可枚举属性,如对象、数组、字符串。针对属性,所以获得 key
  • for…of 遍历一个可迭代对象,如数组、字符串、Map/Set 。针对一个迭代对象,所以获得 value

划重点

“枚举” “迭代” 都是计算机语言的一些基础术语,目前搞不懂也没关系。

但请一定记住 for…of 和 for…in 的不同表现。

连环问:for await…of

用于遍历异步请求的可迭代对象。

// 像定义一个创建 promise 的函数
function createTimeoutPromise(val) {return new Promise(resolve => {setTimeout(() => {resolve(val)}, 1000)})
}

如果你明确知道有几个 promise 对象,那直接处理即可

(async function () {const p1 = createTimeoutPromise(10)const p2 = createTimeoutPromise(20)const v1 = await p1console.log(v1)const v2 = await p2console.log(v2)
})()

如果你有一个对象,里面有 N 个 promise 对象,你可以这样处理

(async function () {const list = [createTimeoutPromise(10),createTimeoutPromise(20)]// 第一,使用 Promise.all 执行Promise.all(list).then(res => console.log(res))// 第二,使用 for await ... of 遍历执行for await (let p of list) {console.log(p)}// 注意,如果用 for...of 只能遍历出各个 promise 对象,而不能触发 await 执行
})()

【注意】如果你想顺序执行,只能延迟创建 promise 对象,而不能及早创建。

即,你创建了 promise 对象,它就立刻开始执行逻辑。

(async function () {const v1 = await createTimeoutPromise(10)console.log(v1)const v2 = await createTimeoutPromise(20)console.log(v2)for (let n of [100, 200]) {const v = await createTimeoutPromise(n)console.log('v', v)}
})()

4. Vue 组件通讯

props / $emit

适用于父子组件。

  • 父组件向子组件传递 props 和事件
  • 子组件接收 props ,使用 this.$emit 调用事件

自定义事件

适用于兄弟组件,或者“距离”较远的组件。

常用 API

  • 绑定事件 event.on(key, fn)event.once(key, fn)
  • 触发事件 event.emit(key, data)
  • 解绑事件 event.off(key, fn)

Vue 版本的区别

  • Vue 2.x 可以使用 Vue 实例作为自定义事件
  • Vue 3.x 需要使用第三方的自定义事件,例如 https://www.npmjs.com/package/event-emitter

【注意】组件销毁时记得 off 事件,否则可能会造成内存泄漏

$attrs

$attrs 存储是父组件中传递过来的,且未在 propsemits 中定义的属性和事件。

相当于 propsemits 的一个补充。

继续向下级传递,可以使用 v-bind="$attrs"。这会在下级组件中渲染 DOM 属性,可以用 inheritAttrs: false 避免。

【注意】Vue3 中移除了 $listeners ,合并到了 $attrs 中。

$parent

通过 this.$parent 可以获取父组件,并可以继续获取属性、调用方法等。

【注意】Vue3 中移除了 $children ,建议使用 $refs

$refs

通过 this.$refs.xxx 可以获取某个子组件,前提是模板中要设置 ref="xxx"

【注意】要在 mounted 中获取 this.$refs ,不能在 created 中获取。

provide / inject

父子组件通讯方式非常多。如果是多层级的上下级组件通讯,可以使用 provide 和 inject 。

在上级组件定一个 provide ,下级组件即可通过 inject 接收。

  • 传递静态数据直接使用 provide: { x: 10 } 形式
  • 传递组件数据需要使用 provide() { return { x: this.xx } } 形式,但做不到响应式
  • 响应式需要借助 computed 来支持

Vuex

Vuex 全局数据管理

答案

  • 父子组件通讯
    • props emits this.$emit
    • $attrs (也可以通过 v-bind="$attrs" 向下级传递)
    • $parent $refs
  • 多级组件上下级
    • provide inject
  • 跨级、全局
    • 自定义事件
    • Vuex

5 v-if和v-show的区别

● 手段: v-if是动态的向DOM树内添加或者删除DOM元素; v-show是通过设 置DOM元素的display样式属性控制显隐;

● 编译过程: v-ift切换有- - 个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换;

● 编译条件: v-if是惰性的,如果初始条件为假,则什么也不做;只有在条件第一 次变为真时才开始局部编译;v-show是在任何条件下,无论首次条件是否为真,都被编译,然后被缓存,而且DOM元素保留;

● 性能消耗: v-i有更高的切换消耗; v-show有更高的初始渲染消耗;

● 使用场景: v-i适合运营条件不大可能改变; v-show适合频繁切换。

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

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

相关文章

SpringMVC之入门搭建框架

文章目录 前言一、SpringMVC简介1.什么是MVC2.什么是SpringMVC3.SpringMVC的特点 二、搭建框架——HelloWorld1.创建maven工程(web项目)2.配置web.xml3.配置springMVC.xml4.创建请求控制器 总结 前言 基础小白第一次走进SpringMVC:了解什么是…

自定义HttpClient工具类

自定义HttpClient工具类 简介 依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency>api 发送get请求: doGet(String url);发送po…

LinkedList

LinkedList的模拟实现&#xff08;底层是一个双向链表&#xff09;LinkedList使用 LinkedList的模拟实现&#xff08;底层是一个双向链表&#xff09; 无头双向链表&#xff1a;有两个指针&#xff1b;一个指向前一个节点的地址&#xff1b;一个指向后一个节点的地址。 节点定…

vim 配置环境变量与 JDK 编译器异常

vim 配置环境变量 使用 vim 打开系统中的配置信息&#xff08;不存在将会创建&#xff09;&#xff1a; vim ~/.bash_profile 以配置两个版本 JDK 为例&#xff08;前提是已安装 JDK&#xff09;,使用上述命令打开配置信息&#xff1a; 输入法调成英文&#xff0c;输入 i&…

Mysql Oracle 区别

1. oracle select *, id需要在星号前加别名&#xff0c;mysql则不需要 mysql语法&#xff1a; select *, id from xin_student_t;oracle语法&#xff1a; select st.*, st.id from xin_student_t st;2. oracle表定义了别名&#xff0c;在查询时可以不用别名指定字段&#xf…

OWASP Top 10(2021)漏洞学习(最新)

A01:2021-权限控制失效 从第五位上升到第一位&#xff0c;94%的应用程序都接受了某种形式的针对“失效的访问控制”的测试&#xff0c;该事件的 平均发生率为 3.81%&#xff0c;该漏洞在提供的数据集中出现漏洞的应用数量最多&#xff0c;总发生漏洞应用数量超过31.8万多 次。 …

Python爬取斗罗大陆全集

打开网址http://www.luoxu.cc/dmplay/C888H-1-265.html F12打开Fetch/XHR&#xff0c;看到m3u8&#xff0c;ts&#xff0c;一眼顶真&#xff0c;打开index.m3u8 由第一个包含第二个index.m3u8的地址&#xff0c;ctrlf在源代码中一查index&#xff0c;果然有&#xff0c;不过/…

解决:(error) ERR unknown command shutdow,with args beginning with

目录 一、遇到问题 二、出现问题的原因 三、解决办法 一、遇到问题 要解决连接redis闪退的问题&#xff0c;按照许多的方式去进行都没有成功&#xff0c;在尝试使用了以下的命名去尝试时候&#xff0c;发现了这个问题。 二、出现问题的原因 这是一个粗心大意导致的错误&am…

【unity小技巧】Unity2D TileMap+柏林噪声生成随机地图(附源码)

文章目录 前言柏林噪声素材导入Rule Tile配置生成随机地图问题扩展问题添加植被源码参考完结 前言 我的上一篇文章介绍了TileMap的使用&#xff0c;主要是为我这篇做一个铺垫&#xff0c;看过上一篇文章的人&#xff0c;应该已经很好的理解TileMap的使用了&#xff0c;这里我就…

C++,从“hello world“开始

一、"hello world" #inclue <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0; } 1.1 #include&#xff1a;预处理标识 1.2 <iostream>&#xff1a;输入输出流类所在头文件 1.2.1 istream&a…

【学习日记】【FreeRTOS】延时列表的实现

前言 本文在前面文章的基础上实现了延时列表&#xff0c;取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记&#xff0c;融入了笔者的理解&#xff0c;代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前&#xff0c;我们使用了一种朴…

Nginx 使用 HTTPS(准备证书和私钥)

文章目录 Nginx生成自签名证书和配置Nginx HTTPS&#xff08;准备证书和私钥&#xff09;准备证书和私钥 Nginx生成自签名证书和配置Nginx HTTPS&#xff08;准备证书和私钥&#xff09; 准备证书和私钥 生成私钥 openssl genrsa -des3 -out server.key 2048这会生成一个加密…

Python 程序设计入门(025)—— 使用 os 模块操作文件与目录

Python 程序设计入门&#xff08;025&#xff09;—— 使用 os 模块操作文件与目录 目录 Python 程序设计入门&#xff08;025&#xff09;—— 使用 os 模块操作文件与目录一、操作目录的常用函数1、os 模块提供的操作目录的函数2、os.path 模块提供的操作目录的函数 二、相对…

图像检索,目标检测map的实现

一、图像检索指标Rank1,map 参考&#xff1a;https://blog.csdn.net/weixin_41427758/article/details/81188164?spm1001.2014.3001.5506 1.Rank1: rank-k&#xff1a;算法返回的排序列表中&#xff0c;前k位为存在检索目标则称为rank-k命中。 常用的为rank1&#xff1a;首…

Flutter 宽高自适应

在Flutter开发中也需要宽高自适应&#xff0c;手动写一个工具类&#xff0c;集成之后在像素后面直接使用 px或者 rpx即可。 工具类代码如下&#xff1a; import dart:ui;class HYSizeFit {static double screenWidth 0.0;static double screenHeight 0.0;static double phys…

.net老项目中Jquery访问webservice

.net老项目中Jquery访问webservice 1. xml类型返回 jQuery.ajax({type: "POST",async: false,url: "WebService/Evection.asmx/GetCheckUpApplyEForm",contentType: "application/json",data: "{lngEvectionID:" eformSNOriginal &…

后端返回可下载的xlsx文件,但是前端接收下载后为乱码

我的接收数据进行处理的代码为&#xff1a; download_signal_list() {return new Promise((resolve, reject) > {get_download_signal({project_id: this.projectId,version_id: this.versionId}).then(response > {const url window.URL.createObjectURL(new Blob([res…

iBooker 布客技术评论 20230818

一、程序员自检手册 为了避免焦虑&#xff0c;你首先需要做的就是梳理你的业务&#xff1a; &#xff08;1&#xff09;你所在的行业是轻资产还是重资产&#xff1f; 重资产就是人绕着机器转&#xff0c;创业需要买一大堆设备。如果是重资产&#xff0c;赶紧换一个。 &…

Dockerfile文件详细

Dockerfile 是一个文本文件&#xff0c;里面包含组装新镜像时用到的基础镜像和各种指令&#xff0c;使用dockerfile 文件来定义镜像&#xff0c;然后运行镜像&#xff0c;启动容器。 dockerfile文件的组成部分 一个dockerfile文件包含以下部分&#xff1a; 基础镜像信息&…

SQL注入之万能用户名

文章目录 分析代码原理实现 分析代码 在安装的cms数据库目录C:\phpStudy\WWW\cms\admin下找到login.action.php文件&#xff0c;查看第20行&#xff0c;发现如下php代码&#xff1a; $user_row $db->getOneRow("select userid from cms_users where username "…