Javascript面试基础6【每日更新10】

news2024/12/23 23:21:51

Gulp

  • gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成

  • Gulp的核心概念:流
  1. 流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向
  • gulp正是通过流和代码优于配置的策略来尽量简化任务编写的工作
  • Gulp的特点:
  1. 易于使用:通过代码优于配置的策略,gulp让简单的任务简单,复杂的任务可管理。
  2. 构建快速利用Node.js 流的威力,你可以快速构建项目并减少频繁的IO操作。
  3. 易于学习通过最少的API,掌握 gulp毫不费力,构建工作尽在掌握:如同一系列流管道
     

Vue双向数据绑定

Vue核心基础-CSDN博客

设计模式—观察者模式与发布订阅-CSDN博客

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过0bject.defineProperty( 来劫持各个属性的setter ,getter ,在数据变动时发布消息给订阅者,触发相应的监听回调
 

事件的各个阶段

在JavaScript中,事件处理是一个重要的概念,它允许开发者在用户与网页进行交互时执行代码。事件处理通常涉及到事件的各个阶段,这些阶段也被称为事件流(Event Flow)或事件传播(Event Propagation)。主要可以分为三个阶段:捕获阶段(Capturing Phase)、目标阶段(Target Phase,也称为事件处理阶段或冒泡前的激活阶段)、冒泡阶段(Bubbling Phase)。

1. 捕获阶段(Capturing Phase)

  • 顺序:从文档的根节点(通常是document对象)开始,向下传播到目标元素。
  • 特点:在捕获阶段,事件处理器会从最外层的节点开始触发,然后向事件的目标节点传播。这个阶段的目的是在事件到达目标节点之前,先给外层的元素机会来处理这个事件。
  • 用途:捕获阶段通常用于事件在到达目标元素之前进行拦截处理,例如,阻止事件进一步传播或修改事件对象。

2. 目标阶段(Target Phase)

  • 顺序:当事件到达目标元素时,会触发目标元素上的事件处理器。
  • 特点:在这个阶段,事件处理器被绑定在目标元素上,即用户实际与之交互的元素。这通常是我们设置事件监听器的地方。
  • 注意:技术上讲,目标阶段并不是事件传播的一个独立阶段,但它发生在捕获阶段和冒泡阶段之间,是事件处理器被目标元素实际调用的时刻。

3. 冒泡阶段(Bubbling Phase)

  • 顺序:从目标元素开始,向上传播到文档的根节点。
  • 特点:在冒泡阶段,事件会从目标元素开始,一直向上传播到DOM树的顶层。这个阶段的目的是允许事件在到达顶层之前,沿途的每个节点都有机会处理这个事件。
  • 用途:冒泡阶段常用于在不特定知道哪个元素会被点击的情况下,处理事件。例如,点击了列表中的某个项,但你可能希望无论点击了哪个项,都能触发同一个事件处理器。

设置事件监听器时指定阶段

在JavaScript中,使用addEventListener方法添加事件监听器时,可以通过第三个参数来指定监听器是在捕获阶段还是冒泡阶段触发。如果省略这个参数,或者将其设置为false,则监听器会在冒泡阶段触发。如果设置为true,则监听器会在捕获阶段触发。

element.addEventListener('click', function(event) {  
    // 事件处理代码  
}, true); // 在捕获阶段触发  
  
element.addEventListener('click', function(event) {  
    // 事件处理代码  
}, false); // 在冒泡阶段触发(默认)

let VS var VS const

  • let
  1. 允许你声明一个作用域被限制在块级中的变量、语句或者表达式。
  2. let绑定不受变量提升的约束,这意味着let声明不会被提升到当前
  3. 该变量处于从块开始到初始化处理的“暂存死区”
  • var
  1. ·声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的
  2. 由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明
  • const
  1. 声明创建一个值的只读引用(即指针)
  2. 基本数据当值发生改变时,那么其对应的指针也将发生改变,故造成const申明基本数据类型时”再将其值改变时,将会造成报错,例如const a = 3 ;a = 5 时将会报错
  3. 但是如果是复合类型时,如果只改变复合类型的其中某个Value 项时,将还是正常使用
     

快速让一个数组乱序

sort方法

const arr=[1,2,3,4,5,6];
arr.sort(function(a,b){
    return Math.random()-0.5;
})

Fisher-Yates洗牌算法

在JavaScript中,快速让一个数组乱序(即打乱数组元素的顺序)的一种常用方法是使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)。这种方法的基本思想是遍历数组元素,并在每一步中随机选择一个未处理的元素与当前元素交换位置。

以下是一个使用Fisher-Yates洗牌算法来打乱数组顺序的示例代码:

function shuffleArray(array) {  
    for (let i = array.length - 1; i > 0; i--) {  
        // 生成一个0到i的随机索引  
        const j = Math.floor(Math.random() * (i + 1));  
        // 交换array[i]和array[j]  
        [array[i], array[j]] = [array[j], array[i]];  
    }  
    return array;  
}  
  
// 示例  
const myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];  
console.log(shuffleArray(myArray));

 如何渲染几万条数据并不卡住界面

考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分DOM,那么就可以通过requestAnimationFrame来每16 ms刷新一次
 

requestAnimationFrame 是 Web API 的一部分,它用于在浏览器下一次重绘之前调用指定的函数来更新动画。这是一种高效的方式来创建平滑的动画,因为它允许浏览器优化和最小化重绘和重排,从而提供更好的性能和用户体验。

当你使用 requestAnimationFrame 时,你需要提供一个回调函数作为参数。浏览器会在这个函数准备好进行屏幕更新之前调用它。这个函数通常用于更新动画的当前状态,比如改变元素的位置或样式。

基本用法

function step(timestamp) {  
  // 更新动画状态  
  // 例如,改变元素的位置  
  // ...  
  
  // 如果需要继续动画,则再次调用 requestAnimationFrame  
  requestAnimationFrame(step);  
}  
  
// 启动动画  
requestAnimationFrame(step);

优点

  1. 高效requestAnimationFrame 由浏览器进行优化,以确保动画的平滑性和性能。
  2. 自动时间间隔:你不需要自己设置时间间隔(如使用 setTimeout 或 setInterval),浏览器会基于屏幕刷新率来调用你的回调函数。
  3. 节省CPU:当标签页或窗口不在前台时,requestAnimationFrame 会自动暂停调用回调函数,从而节省CPU资源。

停止动画

要停止动画,你可以简单地不再调用 requestAnimationFrame。但是,如果你需要从一个特定的回调中停止动画(例如,基于某些条件),你可能需要将 requestAnimationFrame 的返回值(一个ID)保存起来,并使用 cancelAnimationFrame 来取消它。

let animationId = null;  
  
function startAnimation() {  
  animationId = requestAnimationFrame(step);  
}  
  
function stopAnimation() {  
  if (animationId) {  
    cancelAnimationFrame(animationId);  
    animationId = null;  
  }  
}  
  
function step(timestamp) {  
  // ... 更新动画状态  
    
  // 根据需要决定是否继续动画  
  // requestAnimationFrame(step);  
}  
  
// 启动和停止动画  
startAnimation();  
// ... 在某个时刻停止动画  
stopAnimation();

 获取页面所有checkbox

怎样添加、移除、移动、复制、创建和查找节点

在JavaScript中,操作DOM(文档对象模型)是常见的任务,包括添加、移除、移动、复制、创建和查找节点。以下是一些基本的示例,说明如何执行这些操作:

1. 创建节点

要创建一个新的DOM节点,你可以使用document.createElement()方法。

// 创建一个新的div元素  
var newDiv = document.createElement("div");  
  
// 设置其一些属性  
newDiv.id = "newDivId";  
newDiv.className = "newDivClass";  
newDiv.textContent = "这是一个新的div";  
  
// 将新创建的元素添加到body中  
document.body.appendChild(newDiv);

2. 查找节点

查找DOM节点可以使用多种方法,如getElementById(),getElementsByClassName(),

 getElementsByTagName()querySelector()querySelectorAll()

// 通过ID查找  
var elementById = document.getElementById("someElementId");  
  
// 通过类名查找(返回HTMLCollection)  
var elementsByClass = document.getElementsByClassName("someClass");  
  
// 通过标签名查找(返回HTMLCollection)  
var elementsByTagName = document.getElementsByTagName("p");  
  
// 使用querySelector查找第一个匹配的元素  
var firstElement = document.querySelector(".someClass");  
  
// 使用querySelectorAll查找所有匹配的元素(返回NodeList)  
var allElements = document.querySelectorAll(".someClass");

3. 添加节点

将新节点添加到DOM中,可以使用appendChild()insertBefore()

// 将新节点添加到body的末尾  
document.body.appendChild(newDiv);  
  
// 将新节点添加到某个特定元素之前  
var referenceNode = document.getElementById("someElementId");  
document.body.insertBefore(newDiv, referenceNode);

4. 移除节点

使用removeChild()方法可以从DOM中移除一个节点。

var elementToRemove = document.getElementById("someElementIdToRemove");  
if (elementToRemove && elementToRemove.parentNode) {  
    elementToRemove.parentNode.removeChild(elementToRemove);  
}

5. 移动节点

移动节点实际上是一个先移除再添加的过程。首先,使用removeChild()从当前位置移除节点,然后使用appendChild()insertBefore()将其添加到新位置。

6. 复制节点

使用cloneNode()方法可以复制一个节点。这个方法接受一个布尔值作为参数,指定是否进行深复制(复制节点及其所有子节点)。

// 浅复制(只复制节点本身)  
var clonedNode = elementById.cloneNode(false);  
  
// 深复制(复制节点及其所有子节点)  
var clonedNodeDeep = elementById.cloneNode(true);  
  
// 然后,你可以将复制的节点添加到DOM中的某个位置  
document.body.appendChild(clonedNodeDeep);

正则表达式

 正则表达式-CSDN博客

Javascript中callee与caller的作用 

  • caller是返回一个对函数的引用,该函数调用了当前函数;
  • callee是返回正在被执行的function函数,也就是所指定的function对象的正文

在JavaScript中,calleecaller是两个非标准的、但曾经在早期JavaScript版本中广泛使用的属性,它们分别用于函数内部引用当前执行的函数和调用当前函数的外部函数。然而,值得注意的是,由于它们带来的混淆和潜在的性能问题,现代JavaScript开发中通常不推荐使用这两个属性,并且在严格模式(strict mode)下,这两个属性是不可用的。

callee

callee属性是arguments对象的一个属性,它指向当前正在执行的函数本身。这在编写递归函数时特别有用,因为你可以直接使用arguments.callee来引用函数自身,而不需要在函数体内显式地引用函数名。然而,这种做法可能会导致代码难以理解和维护,因为它隐藏了函数的实际名称。

function factorial(n) {  
    if (n <= 1) {  
        return 1;  
    } else {  
        return n * arguments.callee(n - 1);  
    }  
}

现代JavaScript中,更推荐使用函数名来引用自身,或者使用箭头函数来避免thisarguments的混淆。

caller

caller属性是一个函数对象的属性,它指向调用当前函数的函数。这在你需要知道是哪个函数调用了当前函数时非常有用。然而,与callee一样,caller属性也带来了代码可读性和维护性的挑战,并且在严格模式下是不可用的。

function outerFunction() {  
    innerFunction();  
}  
  
function innerFunction() {  
    console.log(innerFunction.caller); // 指向outerFunction  
}  
  
outerFunction();

替代方案

  1. 递归函数:对于递归函数,直接使用函数名而不是arguments.callee
  2. 调试和日志记录:对于需要知道调用栈的情况,考虑使用现代浏览器的开发者工具,或者利用Error对象的堆栈跟踪(尽管这可能会因浏览器而异且不是跨平台的解决方案)。
  3. 设计模式:考虑使用设计模式(如事件监听器、回调函数等)来管理函数间的依赖和调用关系,而不是依赖caller属性。

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

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

相关文章

【前端 14】Vue常见指令

Vue常见指令 Vue.js 是一个构建用户界面的渐进式框架&#xff0c;它通过一系列简洁的指令&#xff08;Directives&#xff09;来增强HTML的功能&#xff0c;使得开发者能够更加方便地构建出响应式的Web应用。本文将详细讲解Vue中的几个核心指令&#xff1a;v-bind、v-model、v…

[算法题]爱丽丝的人偶(一)

题目链接: 爱丽丝的人偶&#xff08;一&#xff09; 定义两个变量, 分别初始化为 1 和 n, 让两个变量不断向中间聚拢, 并同时按先输出最小值再输出最大值的规律输出, 如图: 这样就满足题意排好了, 题解代码: #include <iostream> using namespace std;int main() {int …

PlantUML学习笔记-嵌入式系统设计常用图例

在嵌入式系统设计过程中&#xff0c;需要使用一些图例对系统框架及业务流程进行说明&#xff0c;以便于多人协同开发及后期的系统维护&#xff0c;提高团队开发效率。 1. 嵌入式设计开发常使用的图例&#xff1a; 1.1 用例图&#xff08;Use Case Diagram&#xff09; 用例图…

美国GE工业大项目中断,一天内市值蒸发近290亿人民币,波及西门子等同行……...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 本周二&#xff0c;美国东海岸发生了一起令人瞠目结舌的事件。GE Vernova公司参与的Vineyard Wind海上风电项目的一片巨型涡轮机叶片竟然断裂坠海…

《JavaEE》----2.<多线程的简介创建Thread类>

前言&#xff1a; 大家好&#xff0c;我目前在学习java。我准备利用这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论&#xff01;&#xff01;&#xff01; 喜欢我文…

Python装饰器:让函数更强大

在Python编程中&#xff0c;装饰器是一个强大的工具&#xff0c;它允许程序员以一种简洁优雅的方式修改或增强函数的行为&#xff0c;而无需更改其源代码。本文将介绍装饰器的基本概念、工作原理以及一些实际应用案例。 什么是装饰器&#xff1f; 装饰器本质上是一个接受函数…

Python酷库之旅-第三方库Pandas(049)

目录 一、用法精讲 176、pandas.Series.rank方法 176-1、语法 176-2、参数 176-3、功能 176-4、返回值 176-5、说明 176-6、用法 176-6-1、数据准备 176-6-2、代码示例 176-6-3、结果输出 177、pandas.Series.sem方法 177-1、语法 177-2、参数 177-3、功能 177…

【C语言】数组名的不同情况

前言 在C语言中&#xff0c;数组名的行为在不同的上下文中有细微的区别。数组名本质上是一个指向数组第一个元素的指针&#xff0c;但在某些情况下&#xff0c;它的行为会有所不同。以下是一些关键点&#xff0c;帮助你理解数组名在什么情况下代表第一个元素&#xff0c;什么情…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

智慧港口整体解决方案

1. 智慧港口概况与建设意义 智慧港口建设对创新驱动和转型发展具有重要推动作用&#xff0c;是港口发展的主要方向。它通过物联网、移动互联网、云计算、人工智能等高新技术与港口功能的融合&#xff0c;提升港口的智能化和信息化水平&#xff0c;对国家可持续发展具有重要意义…

一键将桌面资料存到d盘的工具,小巧、绿色、免费、免安装

为了提升我们的系统稳定性以及资料的安全性&#xff0c;建议大家将电脑桌面的资料默认路径设置为D盘或其他磁盘&#xff0c;这样不仅会减少系统盘的占用空间&#xff0c;在系统盘出现故障时我们还可以通过pe工具备份桌面的资料。虽然我们也可以通过一些操作来修改桌面文件以及我…

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点&#xff0c;以便实现前后端分离的技术栈&#xff0c;目前的进度已经大致完成&#xff0c;唯一的问题就是需要安装 JWT token 插件。 功能介绍&#xff1a; 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及&#xff0c;使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑&#xff0c;转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程&#xff0c;如果一旦面对大量的用户访问&#xff0c;整个技术挑战就…

Java1.0标准之重要特性及用法实例(十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

aspeed 2600适配u-boot/kernel

1.说明 本文采取aspeed sdk v09.01版本来适配自己的实际的硬件开发平台。!!非采取qemu模拟方式!! 2.采用的镜像文件 2.1 采用网站编译好的镜像 采用网站: https://github.com/AspeedTech-BMC/openbmc/releases的文件: 1.ast2600-default-515-obmc.tar.gz.选择里面的文件ima…

【初阶数据结构篇】单链表的实现(赋源码)

文章目录 单链表的实现代码位置概念与结构概念&#xff1a;结构&#xff1a; 链表的性质链表的分类单链表的实现单链表的创建和打印及销毁单链表的创建单链表的打印单链表的销毁 单链表的插入单链表头插单链表尾插单链表在指定位置之前插入数据单链表在指定位置之后插入数据 单…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章&#xff0c;有着一个动听的配音&#xff0c;没错&#xff0c;他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型&#xff0c;在Git收获23.5k的Star&#xff…

Flink-CDC解析(第47天)

前言 本文主要概述了Flink-CDC. 1. CDC 概述 1.1 什么是CDC&#xff1f; CDC是&#xff08;Change Data Capture 变更数据获取&#xff09;的简称 &#xff0c;在广义的概念上&#xff0c;只要是能捕获数据变更的技术&#xff0c;都可以称之为 CDC。 核心思想是&#xff0c…

【C语言】【数据结构】二分查找(数组的练习)

目录 一、什么是二分查找 二、算法思想 2.1、概述 2.2、举例 &#xff08;1&#xff09;查找3&#xff08;数组里面存在的数&#xff09; &#xff08;2&#xff09;查找12&#xff08;数组里面不存在的数&#xff09; 三、代码实现 四、计算mid公式的优化 一、…

二阶段测试:

二阶段测试&#xff1a; 架构&#xff1a; 服务器类型部署组件ip地址DR1调度服务器 主&#xff08;ha01&#xff09;KeepalivedLVS-DR192.168.60.30DR2调度服务器 备 (ha02)KeepalivedLVS-DR192.168.60.40web1节点服务器 (slave01)NginxTomcatMySQL 备MHA managerMHA node192.…