前端面试八股-06-11

1、CSS垂直水平居中方法

下面的方法中,“子”代表元素自身

标准盒子—水平居中

margin: 0 auto  //水平居中

 定位—垂直水平居中

父:position: relative;

子:position:absolute;

        top:0;

        right:0;

        bottom:0;

        left:0;

        margin:auto

 表格—垂直水平

父:display:table-cell;

        vertical-align:middle;  //垂直

子:margin:0 auto;  //水平

弹性盒子—垂直水平

方法一:

父:display: flex;
        justify-content: center;    //水平
        align-items: center;   //垂直

方法二:

父:display: flex;

子:margin: auto;

文字在div里—垂直水平

子:line-height: xxx;   //xxx为盒子的高度  垂直

        text-align:center  //水平

 定位+变形

子:position: absolute;

       left: 50%;

       top: 50%;

       transform: translateX(-50%)  translateY(-50%); 

或者

子:position: absolute;

       left: 50%;

       top: 50%;

       margin-top: -50px;
       margin-left: -50px;

 网格—垂直水平

父:display: grid;
        justify-items: center;
        align-items: center;

 2、微任务和宏任务(先宏后微)

js属于单线程,也就是说对于一段js代码片段,只会顺序依次执行,都是同步执行的。而实际使用过程中有些任务执行时间长,有些任务执行时间短,这会导致页面加载时间过长并且出现空白页面的现象,非常影响用户体验。为了解决这个问题产生了宏任务和微任务。

宏任务包含:script(整体代码块)、setTimeOut、setInterval、setImmediate、I/O、UI rendering
微任务包含:promise、Object.observe、MutationObserver

执行顺序看这篇博文,感觉很清晰(虽然我绕晕了但是不妨碍代码示例本身讲的是明白的)

js宏任务和微任务(异步和同步执行的顺序)探究_宏任务与微任务执行顺序详情图-优快云博客

 3、js闭包

  • 闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。直观的说就是形成一个不销毁的栈环境(长期占用内存)。(来自菜鸟)
  • 普通闭包:普通function;严格闭包:函数1内写函数2,然后return函数2(自己理解)
  • 闭包是将函数内部和函数外部连接起来的桥梁。
  • 使得外部函数可以读取局部变量(比如将内部函数作为返回值来实现)。
  • 闭包就是能够读取其他函数内部变量的函数。
  • 闭包的作用:①读取函数内部的变量;②让变量适中保持在内存中
  • 参考下面这个博文,感觉讲的很好:

学习Javascript闭包(Closure) - 阮一峰的网络日志

4、get和post的区别

get:

        url参数可见(长度限制2048字符);

        通过拼接url传递参数;

        get请求可以缓存;

        请求页面后退时,不产生影响;

        产生一个TCP数据包(浏览器把header和data一起发,服务器相应200)

post:

        url参数不可见(长度无限制);

        通过body体传递参数;

        post请求不可缓存;;

        请求页面后退时,重新提交请求;

        产生两个TCP数据包(浏览器先发header 服务器响应100 浏览器再发data 服务器响应200)

注意:

        网络好:一次包和两次包时间差别可无视;

        网络差:两次包更好;

        Firefox中POST只发一次包。

5、http响应状态码

1xx(信息性状态码):请求继续,请求正在处理,一般看不到,比如上面的100

2xx(成功状态码):请求成功

        200:请求成功

        204:服务端成功处理了请求,但返回信息为空

3xx(重定向状态码):重定向,表示需要进一步操作才能完成请求

        301:请求资源已经永久转移至新的url,返回信息包括新的URI,浏览器自动定向到新URI

        302:临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI

4xx(客户端错误状态码):表示请求包含语法错误或无法完成

        400:客户端请求语法错误,服务器不理解

        401:请求页面需要用户名和密码

        403:服务器拒绝客户端请求

        404:服务器找不到请求的网页

        405:客户端请求中的方法被禁止

5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误

        500:服务器内部错误,无法完成请求

        501:服务器不支持请求的功能,无法完成请求

        503:由于超载或系统维护,服务器暂时的无法处理客户端的请求

        505:服务器不支持请求的HTTP协议的版本,无法完成处理

当然:

        程序员最想看到的:200-OK。

        程序员不想看到的:500-Internal-Server-Error。

        用户不想看到的:401-Unauthorized、403-Forbidden、408-Request-Time-out、404-not-found。

6、前端存储方式(常用)

前端性能优化(三)——浏览器九大缓存方法_前端缓存技术有哪些-优快云博客

①Cookies

  • cookie一般通过http请求头发送到服务器
  • 数据可以设置有效期,超出有效期自动清除(删除时将有效期设为过去的时间)
  • 存储数据大小4K以内
  • 只能存储字符串类型
  • 十大属性(见上一篇)
  • 常用操作
    •  setMaxAge - 设置cookie的有效期,时间单位是秒,负值时表示关闭浏览器后就失效,默认值为-1。
    • setDomain - 用于指定,只有请求指定域名才会带上该cookie。
    • setPath - 只有访问该域名下的cookieDemo的这个路径地址才会带cookie。
    • setValue - 重置 value 。

②localStorage

  • 数据可以长久保存,直到手动删除,不受浏览器窗口关闭影响
  • 存储数据大小5M以内
  • 存储数据不会发送到服务器
  • 常用API:
    • localStorage.setItem(key,value) // 保存数据
    • localStorage.getItem(key) // 获取数据
    • localStorage.removeItem(key) // 删除单个数据
    • localStorage.clear() // 删除全部

③sessionStorage

  • 数据在浏览器窗口关闭后清除
  • 存储数据大小5M以内
  • 存储数据不会发送到服务器
  • 常用API:
    • sessionStorage.setItem(key,value) // 保存数据
    • sessionStorage.getItem(key) // 获取数据
    • sessionStorage.removeItem(key) // 删除单个数据
    • sessionStorage.clear() // 删除全部

④IndexedDB

  • 存储大量结构化数据
  • 支持索引进行高效查询

⑤Cache Storage(缓存)

CacheStorage 浏览器缓存-优快云博客

  • 可以将文件(例如脚本、样式表和图像)缓存到浏览器中,并在用户离线时提供离线体验
  • 必须在Service Worker 脚本中使用(因为需要在后台运行)
  • 常见方法:
    • cache.put(request或url、response):添加任意缓存
    • cache.add(request或url):添加缓存
    • cache.addAll(requests[]或url[]):批量添加缓存
    • cache.keys(request或url、options):返回所有的key

7、解决跨域问题

前端跨域问题解决_前端跨域报错-优快云博客

跨域:当一个请求的url的协议、域名、端口号三者之间任意一个与页面当前的url不同即为跨域。

 常见跨域场景:

 解决方式(个人经验非官方):

在根目录的vue.config.js文件中配置代理:

module.exports = {
    devServer: {
        proxy: {
            'api':{
                target:'http://localhost:8081',  //配置target:后台提供的接口地址
                changeOrigin:true,  // true 允许跨域
                pathRewrite:{
                    '^/api':''  //重写路径,如果后台提供的接口本身就带有api,则无需执行重写路径这个步骤
                }
            },
        }
    }
}

8、JS垃圾回收机制

JavaScript垃圾回收机制_js垃圾回收机制-优快云博客

垃圾:没有被引用的对象或变量;无法访问到的对象

垃圾回收机制:执行环境负责管理代码执行过程中使用的内存。JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,没有被释放,导致该内存无法被使用,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

垃圾回收方式:标记清除(常用)、引用计数

        标记清除:当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。

        引用计数:跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时,则说明没有办法再访问这个值了,被视为准备回收的对象,每当过一段时间开始垃圾回收的时候,就把被引用数为0的变量回收。引用计数方法可能导致循环引用,类似死锁,导致内存泄露。

function f1(){
    var a ={}//a的引用次数0
    var b=a//a的引用次数1
    var c=a //a的引用次数2
    var b={}//a的引用次数1
    var c=[]//a的引用次数0
}

<think>好的,我现在需要帮助用户解决关于Dify循环实现的问题。首先,我需要明确用户的具体需求。他们提到“dify 循环实现”或“dify 如何处理循环”,但Dify本身可能没有直接称为“循环”的功能,所以需要结合现有文档中的信息来推断可能的解决方案。 根据用户提供的引用内容,Dify工作流中有迭代节点[^1]。这可能类似于编程中的循环结构,用于重复执行某个任务。例如,在处理列表数据或需要多次执行同一操作时,迭代节点可以派上用场。我需要详细解释迭代节点的配置和使用步骤,确保用户能够理解如何设置循环次数或遍历数据集。 另外,用户可能对如何处理循环中的错误或性能问题感兴趣。引用[2]提到在Dify中处理PEM文件的问题,这可能涉及在循环中正确处理数据格式,避免错误积累。需要提醒用户在循环中注意错误处理和资源管理,确保每次迭代的稳定性。 引用[3]中的例子展示了如何结合FastAPI和Selenium进行实时监控并生成GIF,这可能涉及循环截取浏览器内容。虽然Dify本身可能不直接控制这类循环,但可以通过外部脚本或定时任务触发工作流,模拟循环执行。这部分需要说明如何将外部循环机制与Dify结合使用。 接下来,我需要组织回答结构。首先介绍迭代节点的基本概念和配置步骤,然后讨论循环中的数据处理和错误处理,最后补充外部触发循环的方法。同时,生成相关问题以帮助用户进一步探索,比如优化循环性能或处理复杂数据结构。 需要确保回答符合格式要求,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。同时,引用标识要自然地添加到相关段落末尾,如、[^2]、[^3]。 最后,检查是否有遗漏点,比如Dify的其他循环相关功能或用户可能遇到的常见问题,确保回答全面且易于理解。</think>在Dify中处理循环逻辑主要通过**迭代节点**实现,以下是具体实现方式和应用场景的解析: ### 一、Dify循环实现机制 Dify通过**工作流设计器**中的迭代节点处理循环需求,其核心原理类似编程中的`for循环`。迭代节点可遍历以下数据类型: - 数组列表:`["A","B","C"]` - 字典集合:`{"key1":"value1", "key2":"value2"}` - 数值范围:通过`range()`函数生成序列 配置示例: ```python # 模拟迭代节点的数据输入 input_data = { "dataset": [1,2,3,4,5], "process_logic": "item * 2" # 对每个元素执行乘以2的操作 } ``` ### 二、迭代节点的关键配置步骤 1. **数据源绑定**:将数组/字典类型变量连接到迭代节点的输入端口 2. **循环变量命名**:设定当前元素的变量名(默认为`item`) 3. **子流程设计**:在迭代节点内部构建需要重复执行的逻辑模块 4. **结果聚合**:通过`outputs`收集所有迭代结果,支持数组或对象格式 $$ \text{总耗时} = \sum_{i=1}^{n}(单次迭代时间_i) + 系统开销 $$ ### 三、循环中的特殊处理 1. **错误中断控制**: - 启用`continueOnError`参数可跳过失败迭代 - 通过`try-catch`模块包裹敏感操作 2. **并行优化**: ```python # 伪代码示例 Parallel.forEach(dataset, lambda item: process(item)) ``` 3. **结果过滤**: ```python filtered = filter(lambda x: x%2==0, processed_results) ``` ### 四、应用场景案例 1. **批量文件处理**:遍历存储桶中的文件列表进行格式转换 2. **数据清洗**:对数据库查询结果集进行逐条校验 3. **API轮询**:定时循环调用第三方接口直到满足特定条件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值