当前位置: 首页 > news >正文

Javascript前端面试基础(八)

window.onload和$(document).ready区别

  • window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行
  • $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕

window.onload

  • 触发时机window.onload 事件会在整个页面(包括所有的依赖资源,如图片、样式表和脚本文件等)完全加载后触发。这意味着页面上的所有资源都必须加载完成,window.onload 事件才会触发。
  • 使用场景:适用于需要在页面所有资源(如图片、外部脚本等)加载完成后才执行的代码。例如,如果你需要在页面加载完成后立即显示一个包含图片的模态框,那么使用 window.onload 是合适的。
  • 原生JavaScriptwindow.onload 是原生 JavaScript 的一部分,不需要额外的库或框架。

$(document).ready()

  • 触发时机$(document).ready() 是 jQuery 中的一个方法,它在 DOM 完全就绪后触发,但不等待像图片这样的外部资源加载完成。这意味着 DOM 树已经被完全构建和解析,但可能还有像图片这样的元素在加载中。
  • 使用场景:适用于需要在 DOM 元素可用后立即执行代码,但又不需要等待所有资源(如图片)加载完成的情况。这对于初始化插件、绑定事件监听器等操作非常有用。
  • jQuery 依赖$(document).ready() 是 jQuery 特有的方法,因此它依赖于 jQuery 库。

 addEventListener()和attachEvent()的区别

  • addEventListener(是符合W3C规范的标准方法; attachEvent()是IE低版本的非标准方法
  • addEventListener()支持事件冒泡和事件捕获;-而attachEvent()只支持事件冒泡addEventListener()的第一个参数中,事件类型不需要添加on ; attachEvent(需要添加'on'
  • 如果为同一个元素绑定多个事件, addEventListener()会按照事件绑定的顺序依次执行,attachEvent()会按照事件绑定的顺序倒序执行
     

 数组去重方法总结

1. 使用ES6的Set结构

ES6 提供了 Set 数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。利用这一特性,可以轻松实现数组去重。

let arr = [1, 2, 2, 3, 4, 4, 5];  
let uniqueArr = [...new Set(arr)];  
console.log(uniqueArr); // [1, 2, 3, 4, 5]

2. 使用filter()和indexOf()

filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。而 indexOf() 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。通过这两个方法结合使用,也可以实现数组去重。

let arr = [1, 2, 2, 3, 4, 4, 5];  
let uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);  
console.log(uniqueArr); // [1, 2, 3, 4, 5]

3. 使用Map数据结构

Map 对象保存键值对,并且能够记住键的原始插入顺序。利用这一特性,也可以实现数组去重。

let arr = [1, 2, 2, 3, 4, 4, 5];  
let map = new Map();  
let uniqueArr = arr.filter(item => !map.has(item) && map.set(item, true));  
console.log(uniqueArr); // [1, 2, 3, 4, 5]

4. 使用reduce()

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。通过 reduce(),我们也可以实现数组去重。

let arr = [1, 2, 2, 3, 4, 4, 5];  
let uniqueArr = arr.reduce((acc, current) => {  if (acc.indexOf(current) === -1) {  acc.push(current);  }  return acc;  
}, []);  
console.log(uniqueArr); // [1, 2, 3, 4, 5]

5. 使用for循环

最后,虽然不如上面的方法简洁,但你也可以使用传统的 for 循环结合 indexOf() 方法实现去重

let arr = [1, 2, 2, 3, 4, 4, 5];  
let uniqueArr = [];  
for (let i = 0; i < arr.length; i++) {  if (uniqueArr.indexOf(arr[i]) === -1) {  uniqueArr.push(arr[i]);  }  
}  
console.log(uniqueArr); // [1, 2, 3, 4, 5]

 75(设计题)想实现一个对页面某个节点的拖曳?如何做(使用原生JS)

  • ”给需要拖拽的节点绑定mousedown , mousemove , mouseup 事件
  1. mousedown事件触发后,开始拖拽
  2. mousemove时,需要通过event.c1ientX和clientY获取拖拽位置,并实时更新位置
  3. mouseup时,拖拽结束

  76 Javascript全局函数和全局变量

全局变量

  • infinity 代表正的无穷大的数值。
  • NaN指示某个值是不是数字值。
  • undefined 指示未定义的值。

全局函数

  • decodeURI()解码某个编码的 URI 。
  • decodeURIComponent(解码一个编码的 URI组件。encodeURI()把字符串编码为URI。
  • encodeURIComponent()把字符串编码为URI 组件。escape()对字符串进行编码。
  • eval() 计算JavaScript字符串,并把它作为脚本代码来执行。
  • isFinite()检查某个值是否为有穷大的数。
  • isNaN()检查某个值是否是数字。
  • Number()把对象的值转换为数字。
  • parseFloat()解析一个字符串并返回一个浮点数。parseInt()解析一个字符串并返回一个整数。String()把对象的值转换为字符串。
  • unescape()对由escape()编码的字符串进行解码

使用js实现⼀个持续的动画效果

在JavaScript中,实现一个持续的动画效果通常涉及到定时器(如setIntervalrequestAnimationFrame)来不断更新DOM元素的属性(如位置、大小、透明度等),以产生动画效果。这里,我将使用requestAnimationFrame来展示一个简单的例子,因为它提供了更好的性能和更平滑的动画效果。

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>持续动画示例</title>  
<style>  #movingBox {  width: 50px;  height: 50px;  background-color: blue;  position: absolute;  left: 0;  }  
</style>  
</head>  
<body>  
<div id="movingBox"></div>  
<script src="animate.js"></script>  
</body>  
</html>

function animateBox(element, startX, endX, duration) {  let startTime = null;  function step(timestamp) {  if (!startTime) startTime = timestamp;  const progress = timestamp - startTime;  const position = startX + (progress / duration) * (endX - startX);  // 更新元素的位置  element.style.left = position + 'px';  // 如果动画未结束,则继续动画  if (progress < duration) {  requestAnimationFrame(step);  }  }  // 开始动画  requestAnimationFrame(step);  
}  // 获取元素并调用动画函数  
const box = document.getElementById('movingBox');  
animateBox(box, 0, 500, 3000); // 从左到右移动,持续3秒

这个例子中,animateBox函数接受一个DOM元素、起始X位置、结束X位置和持续时间作为参数。它使用requestAnimationFrame来更新元素的位置,直到达到指定的结束位置或持续时间结束。

注意事项

  • requestAnimationFrame的回调函数接收一个时间戳参数,它表示调用requestAnimationFrame时的时间。这个时间戳可以用来计算动画的进度。
  • 使用requestAnimationFrame相比setIntervalsetTimeout,可以更有效地控制动画的帧率,并且更节能,因为它在浏览器重绘之前调用回调函数,避免了不必要的绘制工作。
  • 为了让动画看起来更自然,可以根据需要调整动画的速度曲线(如线性、缓入、缓出等)。
  • 当你不再需要动画时,可以使用cancelAnimationFrame来停止它,以避免不必要的资源消耗

 

 封装一个函数,参数是定时器的时间,.then执行回调函数

 项目做过哪些性能优化?

  • 减少HTTP请求数
  • 减少DNS 查询使用CDN
  • 避免重定向图片懒加载
  • 减少DOM元素数量·
  • 减少DOM操作
  • 使用外部JavaScript和css
  • 压缩JavaScript .css、字体、图片等
  • 优化 css Sprite
  • 使用iconfont
  • 字体裁剪
  • 多域名分发划分内容到不同域名”
  • 尽量减少iframe使用
  • 避免图片src为空
  • ·把样式表放在link 中
  • .把JavaScript放在页面底部

 JS怎样判断两个对象相等

1. 递归比较

通过递归地遍历对象的每个属性,并比较它们的值和类型,可以编写一个函数来检查两个对象是否相等。这种方法比较复杂,但可以处理嵌套对象和数组

function deepEqual(obj1, obj2) {  if (obj1 === obj2) {  return true;  }  if (typeof obj1 !== 'object' || obj1 === null ||  typeof obj2 !== 'object' || obj2 === null) {  return false;  }  const keys1 = Object.keys(obj1);  const keys2 = Object.keys(obj2);  if (keys1.length !== keys2.length) {  return false;  }  for (let key of keys1) {  if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {  return false;  }  }  return true;  
}  // 示例  
const obj1 = { a: 1, b: { c: 2 } };  
const obj2 = { a: 1, b: { c: 2 } };  
console.log(deepEqual(obj1, obj2)); // true

2. 使用JSON.stringify()

一种简单但可能不总是可靠的方法是使用JSON.stringify()将对象转换成字符串,然后比较这些字符串。这种方法简单且易于实现,但它不能处理函数、undefined、循环引用等特殊情况。

function shallowEqualJson(obj1, obj2) {  return JSON.stringify(obj1) === JSON.stringify(obj2);  
}  // 示例  
const obj1 = { a: 1, b: 2 };  
const obj2 = { a: 1, b: 2 };  
console.log(shallowEqualJson(obj1, obj2)); // true

3. 使用库

许多流行的JavaScript库(如Lodash)提供了深度比较对象的功能。例如,Lodash的_.isEqual方法能够处理复杂的数据结构,包括嵌套对象和数组。

// 假设已经通过<script>标签或npm/yarn引入了Lodash  
const _ = require('lodash');  const obj1 = { a: 1, b: { c: 2 } };  
const obj2 = { a: 1, b: { c: 2 } };  
console.log(_.isEqual(obj1, obj2)); // true

相关文章:

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…...

R 语言学习教程,从入门到精通,R的安装与环境的配置(2)

1、R的安装与环境的配置 R语言是一款完全免费且开源的软件&#xff0c;它的开源许可证是GNU通用公共许可证&#xff08;GPL&#xff09;&#xff0c;这意味着任何人都可以自由地使用、复制、修改和发布R语言的源代码&#xff0c;甚至可以将其用于商业用途。 和python等其他语言…...

Python批量下载音乐功能

Python批量下载音乐功能 Python批量下载音乐,调用API接口,同时下载歌曲和歌词 先安排一下要用的模块&#xff0c;导入进来。 import re import json import requests目录结构 下载音乐 Awking_Class.pymusic.txt 文件文件写的是音乐名字,使用换行分割 new_music 注意这个 ne…...

用 Bytebase 实现批量、多环境、多租户数据库的丝滑变更

Bytebase 提供了多种功能来简化批量变更管理&#xff0c;适用于多环境或多租户情况。本教程将指导您如何使用 部署配置 和 数据库组 在不同场景下进行数据库批量变更。 默认流水线 vs 部署配置 图片数据库 vs 数据库组 1. 准备 请确保已安装 Docker&#xff0c;如果本地没有重…...

java之方法引用 —— ::

目录 一、简介 二、引用静态方法 1.格式 2.示例 ​编辑 3.条件解析 三、引用成员方法 1.格式 2.示例 四、引用构造方法 1.格式 2.示例 五、类名引用成员方法 1.格式 2.略微不同的方法引用规则 3.示例 六、引用数组的构造方法 1.格式 2.示例 一、简介 方…...

「测试线排查的一些经验-上篇」 后端工程师

文章目录 端口占用脚本失灵线上部署项目结构模版配置文件生效 一般产品研发过程所使用的环境可分为&#xff1a; 研发环境-dev测试环境-test生产环境-prod 软件开发中&#xff0c;完整测试环境包括&#xff1a;UT、IT、ST、UAT UT Unit Test 单元测试 IT System Integration …...

AOSP12_BatteryStats统计电池数据信息

前言 BatteryStats模块主要用于设备在电池供电是系统对各个模块电量使用的统计,Android提供的Battery Historain工具就是对此模块统计的数据进行解析和展示。 一 BatteryStats模块类图 模块主要类图如下:见根目录的模块类图 BatteryStats:抽象类,本模块的核心类,主要定…...

【Android Studio】UI 布局

文章目录 view布局LinearLayout view 在Android开发中&#xff0c;View是一个非常重要的概念&#xff0c;它是所有用户界面组件的基类。View类及其子类构成了Android应用中的用户界面。每个View都占用屏幕上的一个矩形区域&#xff0c;并可以响应用户输入&#xff08;如触摸、按…...

虚拟机Windows server忘记密码解决方法

原理 utilman.exe是Windows辅助工具管理器程序&#xff0c;‌虽然它本身不是一个关键的系统进程&#xff0c;‌但通过修改这个文件&#xff0c;‌用户可以访问一些有用的UI设置。‌在某些情况下&#xff0c;‌比如忘记密码需要重置时&#xff0c;‌通过修改utilman.exe文件为c…...

【香橙派系列教程】(六)嵌入式SQLite数据库

【六】嵌入式SQLite数据库 文章目录 【六】嵌入式SQLite数据库1.简介2.SQLite数据库安装3.SQLite命令用法1.创建数据库2.创建和查看表格3.插入查看数据&#xff08;记录&#xff09;4.删除更改数据&#xff08;记录&#xff09; 4.SQLite编程操作1.打开/创建数据库的C接口2.创建…...

深入探讨PHP8的新特性与性能优化

本文由 ChatMoney团队出品 随着互联网技术的飞速发展&#xff0c;PHP作为后端开发领域的热门语言也在不断演进。近期&#xff0c;PHP8的发布引起了广泛关注。本文将为您详细介绍PHP8的新特性以及性能优化&#xff0c;并通过具体示例帮助您更好地理解和应用这些新特性。 一、PH…...

2024年06月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共10题,共30分) 第1题 运行下列程序,输入单词“PLAY”,最后角色说?( ) A:LY4AP B:AP4LY C:YA4PL D:PL4AY 答案:B 根据程序分析可知,首先获取单词字符数,然后奇数位的字母放在字符数左侧,偶数位…...

书生大模型全链路开源体系

书生大模型全链路开源体系 数据 预训练 微调 评测 部署 应用...

极简聊天室-websocket版(双向通信)

我们知道WebSocket是可以双向通信的&#xff0c;把极简聊天室代码又改了一下&#xff0c;前端发信息到后端也使用websocket&#xff0c;其实代码量更少了。。。 const express require(express); const app express(); var wsServer require(express-ws)(app)var msgs[];ap…...

从小白到架构师 | 缓存预热

缓存预热指的是在系统启动或上线前&#xff0c;提前将经常访问的数据加载到缓存中&#xff0c;以避免在系统刚启动时&#xff0c;用户大量请求直接访问数据库&#xff0c;导致数据库压力过大或系统性能下降。通过缓存预热&#xff0c;可以确保系统一上线就能提供快速的响应时间…...

Modbus -- TCP协议

MODBUS TCP协议是一种基于TCP/IP协议的Modbus变种&#xff0c;它允许Modbus协议在以太网网络上运行&#xff0c;使得设备之间可以通过IP网络交换数据。 一:协议概述 modbus_TCP协议:走的是网口&#xff0c;所以需要创建TCPclient对象进行通信,和modubus-RTU协议最大的区别是&a…...

python四舍五入取整数

在Python中&#xff0c;如果你想要对一个浮点数进行四舍五入并取整&#xff08;即只保留整数部分&#xff09;&#xff0c;你可以使用内置的round()函数&#xff0c;但不指定第二个参数&#xff08;即小数位数&#xff09;&#xff0c;或者明确指定为0。这样&#xff0c;Python…...

洛谷 P1868 饥饿的奶牛

原题 题目描述 有一条奶牛冲出了围栏&#xff0c;来到了一处圣地&#xff08;对于奶牛来说&#xff09;&#xff0c;上面用牛语写着一段文字。 现用汉语翻译为&#xff1a; 有 N 个区间&#xff0c;每个区间x,y 表示提供的x∼y 共y−x1 堆优质牧草。你可以选择任意区间但不…...

Arco Design 之Table表格

此篇文章为table表格示例&#xff0c;包含列、data数据、展开、选中、自定义等相关属性 基础表格 <a-table :columns"columns1" :data"tableData1" />const columns1 [{ title: "编号", dataIndex: "no"},{ title: "名称…...

Python机器学习 模型

Python机器学习模型、回归预测模型、数据清洗、数据处理、数据挖掘、数据分析代做。 模型不仅限于线性回归、逻辑回归、决策树、SVM、随机森林、贝叶斯、XGBoost、LightGBM、CatBoost&#xff0c;聚类&#xff1a;K-Means、DBSCAN&#xff0c;机器学习都可。 时间序列分析&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...