Javascript面试基础6【每日更新10】
Gulp
- gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成
- Gulp的核心概念:流
- 流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向
- gulp正是通过流和代码优于配置的策略来尽量简化任务编写的工作
- Gulp的特点:
- 易于使用:通过代码优于配置的策略,gulp让简单的任务简单,复杂的任务可管理。
- 构建快速利用Node.js 流的威力,你可以快速构建项目并减少频繁的IO操作。
- 易于学习通过最少的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
- 允许你声明一个作用域被限制在块级中的变量、语句或者表达式。
- let绑定不受变量提升的约束,这意味着let声明不会被提升到当前
- 该变量处于从块开始到初始化处理的“暂存死区”
- var
- ·声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的
- 由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明
- const
- 声明创建一个值的只读引用(即指针)
- 基本数据当值发生改变时,那么其对应的指针也将发生改变,故造成const申明基本数据类型时”再将其值改变时,将会造成报错,例如const a = 3 ;a = 5 时将会报错
- 但是如果是复合类型时,如果只改变复合类型的其中某个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);
优点
- 高效:
requestAnimationFrame
由浏览器进行优化,以确保动画的平滑性和性能。 - 自动时间间隔:你不需要自己设置时间间隔(如使用
setTimeout
或setInterval
),浏览器会基于屏幕刷新率来调用你的回调函数。 - 节省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中,callee
和caller
是两个非标准的、但曾经在早期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中,更推荐使用函数名来引用自身,或者使用箭头函数来避免this
和arguments
的混淆。
caller
caller
属性是一个函数对象的属性,它指向调用当前函数的函数。这在你需要知道是哪个函数调用了当前函数时非常有用。然而,与callee
一样,caller
属性也带来了代码可读性和维护性的挑战,并且在严格模式下是不可用的。
function outerFunction() { innerFunction();
} function innerFunction() { console.log(innerFunction.caller); // 指向outerFunction
} outerFunction();
替代方案
- 递归函数:对于递归函数,直接使用函数名而不是
arguments.callee
。 - 调试和日志记录:对于需要知道调用栈的情况,考虑使用现代浏览器的开发者工具,或者利用
Error
对象的堆栈跟踪(尽管这可能会因浏览器而异且不是跨平台的解决方案)。 - 设计模式:考虑使用设计模式(如事件监听器、回调函数等)来管理函数间的依赖和调用关系,而不是依赖
caller
属性。
相关文章:

Javascript面试基础6【每日更新10】
Gulp gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流,简单来说就是建立在面向对象基础上的一种抽象的…...

CTF Web信息搜集 25000字详解
目录 前言信息收集常见信息分类域名信息whois备案CDN子域名解析记录 旁站C段服务器信息端口服务器类型数据库类型waf防火墙 网站信息备份文件备份文件常见的后缀名备份文件常见的文件名gedit备份文件vim备份文件收集方法 敏感目录CMS类型(指纹识别)探针泄…...

MSPM0G3507之电赛小车
一、前言 本文没什么技术分享,纯聊天。以下内容均为笔者的浅薄理解,有不对的地方还请多多包涵。 二、相关配置 主控单元:MSPM0G3507SPTR(48角) 编译环境:Keil5.33、5.39(推荐)都可 …...

linux运维一天一个shell命令之vmstat详解
概念 vmstat 是 Linux 系统中一个非常有用的工具,主要用于报告系统的虚拟内存、进程、CPU 活动和 IO 性能等信息。以下是对 vmstat 工具的详细解释: 基本语法 vmstat [options] [delay [count]]delay:更新的时间间隔(以秒为单…...

前端开发调试工具推荐分类整理
具体前往:前端调试工具分类整理汇总...

http协议与nginx
动态页面与静态页面的差别: (1)URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“?” (2)后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…...

一款国外开发的高质量WordPress下载站模板主题
5play下载站是由国外站长开发的一款WordPress主题,主题简约大方,为v1.8版本, 该主题模板中包含了上千个应用,登录后台以后只需要简单的三个步骤就可以轻松发布apk文章, 我们只需要在WordPress后台中导入该主题就可以…...

Laravel为什么会成为最优雅的PHP框架
Laravel之所以成为最优雅的PHP框架之一,是因为它提供了一系列的优点,包括简洁的语法、强大的功能集、高度模块化和可扩展性、优雅的ORM、内置认证系统、丰富的社区支持和测试友好等。这些优点使得Laravel在PHP框架中脱颖而出,成为了很多开发者的首选框架。 官网:https://l…...

孤儿进程的例子
先让父进程死亡,子进程的父进程会被操作系统管理 先使用gcc编译代码, 执行代码后用 ps -p <进程号> -f 查看进程 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h>int main() {pid_t pid;// 创建…...

CSS前端面试题——怎么用CSS实现一个宽高自适应的正方形?
方法一:使用 padding 方案 这种方法通过设置元素的 padding 属性来实现宽高比例相等的正方形。假设我们希望正方形的边长为相对于父容器的百分比值,比如50% .square {width: 50%; /* 可以是任意宽度,这里假设为父元素宽度的50% */padding-t…...

谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成
文章目录 一,56-商品服务-API-三级分类-修改-拖拽功能完成二,57-商品服务-API-三级分类-修改-批量拖拽效果1,增加按钮2,多次拖拽一次保存完整代码 在构建商品服务API中的三级分类修改功能时,拖拽排序是一个直观且高效的…...

Shader入门精要总结(二)矩阵
1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘,它们的结果AB将会是一个rc大小的矩阵,不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#…...

基于CentOS Stream 9平台安装MySQL Community Server 9.0.1 Innovation
1. 安装之前 1.1 查看系统版本 cat /etc/redhat-releaseCentOS Stream release 9 1.2 查看cpu架构 lscpu架构: x86_64 CPU 运行模式: 32-bit, 64-bit 2. 官网下载 https://dev.mysql.com/downloads/mysql/ 要多看看 官方9.0文档:https://d…...

正则采集器之五——商品匹配规则
需求设计 实现分析 系统通过访问URL得到html代码,通过正则表达式匹配html,通过反向引用来得到商品的标题、图片、价格、原价、id,这部分逻辑在java中实现。 匹配商品的正则做成可视化编辑,因为不同网站的结构不同,同…...

一键切换阿里yum源(包括其他系统repo镜像查找方法)
一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…...

Fiddler学习笔记
目录 前言 简介 原理 界面 前言 测试可以使用fiddler工具,通过抓包的方式修改前端参数和模拟后端返回,快速定位缺陷。 简介 Fiddler是HTTP协议调试代理工具,可以记录并检查所有客户端和服务器之间的HTTP和HTTPS请求,允许监视…...

【Vue3】watch 监视多种类型数据
【Vue3】watch 监视多种类型数据 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…...

【C++入门】虚函数与多态
文章目录 前言虚函数是什么?如何使用虚函数? 纯虚函数是什么?虚函数与普通函数的区别虚表虚表是什么?含有虚表的类内存结构图如何找到虚表的地址?示例代码代码解释 多态是什么?如何使用多态?为什…...

wpf中轮询显示图片
本文的需求是,在一个文件夹中,放一堆图片的集合,然后在wpf程序中,按照定时的方式,循序显示照片。 全部代码 1.声明一个PictureInfo类 namespace WpfApp1 {public class PictureInfo{public string? FileName { get; …...

CSA笔记9-磁盘管理(2)
分区挂载 挂载:将该文件系统中的内容与指定的目录关联起来,使得你可以通过该目录来访问文件系统中的文件和目录。 mount 命令用来挂载文件系统 #挂载/dev/sda1和/dev/sda2 [rootlocalhost ~]# mkdir test{1..2} [rootlocalhost ~]# ll test1 te…...

Python入门第三课
# 入门第三课 # 关键字 if and or in not in ! car g print(car g) print(car dd) if car ! hh:print("wlcome to here ") age 33 print(age 33) print(age 44) age1 44 if age >0 and age1 > 0:print("nihao") if age >0 or age1 > …...

java计算器,输入公式和对应变量的值
目标:最近想写个东西,本质就是一个计算器,我们可以输入公式(例如:ab),然后把公式的值(a:10,b:20)也输入进去。最后得到结果。核心:这个想法核心部分就是给一个…...

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势
跨境电商行业近年来呈现出爆发式增长,随着全球化贸易壁垒的降低和数字经济的快速发展,越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据,全球跨境电商交易额在2023年已超过4万亿美元,并预计在未来几年内仍将保持两位…...

redis面试(二)List链表数据
list 列表 我们总是说List为列表,其实在真正的数据结构来说,redis是自己基于c语言来实现的双向链表数据结构,主要的逻辑就是每个节点都可以指向下一个节点,这个结构就属于链表数组结构。 每个节点中的属性如下: type…...

SpringDataJPA(三):多表操作,复杂查询
一、Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import …...

嵌入式硬件面试题集萃:从基础到进阶
基础问题 问题: 解释什么是微控制器,以及它与微处理器的区别。 答案: 微控制器是具有集成内存和输入/输出外设的微型计算机。与通用微处理器相比,微控制器通常用于控制特定应用,而不是执行通用计算任务。 问题: 什么是数字逻辑门,…...

easyui-datebox 只显示月份选择,默认开启月份,隐藏日期选择框
如果你使用 easyui-datebox 并希望隐藏日期选择框,只显示月份选择,可以通过一些自定义代码来实现。虽然 EasyUI 没有直接提供这种功能,但可以通过自定义 formatter 和 parser 方法,以及修改 onShowPanel 事件来实现这个功能。 以下…...

【数据结构】队列(链表实现 + 力扣 + 详解 + 数组实现循环队列 )
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构 📚本系列文章为个人学…...

02 Go语言操作MySQL基础教程_20240729 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728 基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相…...

相交链表 - 力扣(LeetCode)C语言
160. 相交链表 - 力扣(LeetCode) (点击前面链接即可查看题目) 一、题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始…...