Javascript前端面试基础(八)

news2024/9/9 1:21:08

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

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

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

相关文章

【案例】区分是平行眼还是交叉眼,以及平行眼学习方法

案例一&#xff1a; 交叉眼&#xff1a;看到凸出的“灌水”&#xff0c;即文字好像显示在屏幕前面。PS&#xff1a;看的时候眼睛是斗鸡眼&#xff0c;容易疲劳 平行眼&#xff1a;看到凹陷的“灌水”&#xff0c;即文字好像显示在屏幕后面。PS&#xff1a;看的时候眼睛是平视…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

Java面试八股之简述spring的自动装配

简述spring的自动装配 Spring框架的自动装配&#xff08;Autowiring&#xff09;是一种机制&#xff0c;它允许Spring IoC容器自动满足Bean的依赖关系&#xff0c;而无需显式指定依赖注入的方式。这极大地简化了配置&#xff0c;并有助于减少配置错误。 Spring支持多种自动装…

硅纪元视角 | 苹果AI训练数据大曝光,坚持用户隐私第一

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

鲁迅曾经说过?现在没有中间派!以后也没有!——早读(逆天打工人爬取热门微信文章解读)

今天用了AI的风格模方&#xff0c;鲁迅的&#xff0c;开头那一小段改写&#xff0c;大家觉得如何&#xff1f; 引言Python 代码第一篇 续上第二篇 十点读书 “新型不孝”正在蔓延&#xff0c;很多父母浑然不知&#xff0c;还逢人就炫耀子女有出息结尾 引言 最近 我发觉自己的作…

手摸手教你撕碎西门子S7通讯协议02--socket连接

1、S7协议通讯流程回顾 1&#xff09;建立Socket连接&#xff1a;进行TCP三次握手 这里是指要建立socket的tcp连接&#xff0c;是tcp连接而不是udp连接&#xff0c;tcp连接是可靠连接&#xff0c;tcp连接就是要有稳定的IP地址&#xff0c;它是通过字节方式进行通讯&#xff…

OpenSSL SSL_connect: Connection was reset in connection to github.com:443

OpenSSL SSL_connect: Connection was reset in connection to github.com:443 目录 OpenSSL SSL_connect: Connection was reset in connection to github.com:443 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

云计算 华为云服务

配置虚拟私有云 云平台架管理 跳板机配置 ansible 管理主机 dnf install -y ansible-core glibc-langpack-zh ssh-keygenchmod 0400 /root/.ssh/id_rsa ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.125 ansible --version 代理 Yum 仓库 dnf install -y nginx vim /et…

MySQL使用教程 最最最实用的零基础教程 直接从安装开始教!!!!

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…

虚拟现实辅助工程技术在电气安全培训中的变革力量

近年来&#xff0c;随着数字化进程的不断加快&#xff0c;虚拟现实辅助工程&#xff08;VAE&#xff09;技术在各行各业中的应用愈发广泛。在电气安全培训领域&#xff0c;虚拟现实辅助工程技术正逐渐成为一种具有变革力量的工具。这项技术的引入不仅为电气工作者提供了更为安全…

会计财务公司代理小程序源码系统 带手机端 完整的源代码包以及搭建部署教程

系统概述 会计财务公司代理小程序源码系统是一款专为会计财务公司量身定制的小程序解决方案。该系统结合了财务管理、代理记账、税务筹划等核心功能&#xff0c;旨在帮助企业提高工作效率&#xff0c;优化客户服务体验。通过这款小程序&#xff0c;企业可以为客户提供更加便捷…

数据库管理-第225期 Oracle DB 23.5新特性一览(20240730)

数据库管理225期 2024-07-30 数据库管理-第225期 Oracle DB 23.5新特性一览&#xff08;20240730&#xff09;1 二进制向量维度格式2 RAC上的复制HNSW向量索引3 JSON集合4 JSON_ID SQL函数5 优化的通过网络对NVMe设备的Oracle的原生访问6 DBCA支持PMEM存储7 DBCA支持标准版高可…

【EasyAi】一个开箱即用,每一个Java开发者都可以使用的人工智能AI框架

前言 EasyAi对于Java的用处&#xff0c;等同于在JavaWeb领域spring的意义一样——做一个开箱即用&#xff0c;让每一个开发者都可以使用EasyAi&#xff0c;来开发符合自己人工智能业务需求的小微模型&#xff0c;这就是它的使命&#xff01; EasyAi介绍 EasyAi无任何依赖&…

【无标题】web+http协议+nginx搭建+nginx反向代理(环境准备)

一&#xff0e;Web 为用户提供互联网上浏览信息的服务&#xff0c;web服务是动态的&#xff0c;可交互的。 1.安装httpd yum -y install httpd 2.启动 systemctl start httpd 3.关闭防火墙 systemctl stop firewalld [rootrs html]# echo "我手机号是" > …

一篇文章掌握Python爬虫的80%

转载&#xff1a;一篇文章掌握Python爬虫的80% Python爬虫 Python 爬虫技术在数据采集和信息获取中有着广泛的应用。本文将带你掌握Python爬虫的核心知识&#xff0c;帮助你迅速成为一名爬虫高手。以下内容将涵盖爬虫的基本概念、常用库、核心技术和实战案例。 一、Python 爬虫…

昇思 25 天学习打卡营第 21 天 | MindSpore CycleGAN图像风格迁移互换

1. 背景&#xff1a; 使用 MindSpore 学习神经网络&#xff0c;打卡第 21 天&#xff1b;主要内容也依据 mindspore 的学习记录。 2. CycleGAN 介绍&#xff1a; MindSpore 的 CycleGAN 的图像风格迁移互换 论文地址 论文中文翻译地址 主要流程&#xff1a; 我们有一个转换…

做前端4年了,才明白技术的本质不过是工具而已

四年前&#xff0c;我踏上了前端开发的道路&#xff0c;从HTML和CSS到JavaScript&#xff0c;从jQuery到React&#xff0c;每一步都走得踏实而坚定。随着经验的积累&#xff0c;技术的进步&#xff0c;我逐渐认识到&#xff0c;所谓的“技术”&#xff0c;无非是实现目标的一种…

[C++探索]初始化列表,static成员,友元函数,内部类,匿名对象

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

Docsify:快速用Markdown文档搭建网站的利器

Github官方地址&#xff1a;Docsify 什么是Docsify&#xff1f; 对于经常写博客的人来说&#xff0c;markdown大家都不陌生。今天介绍一个在最近需求中碰到的软件Docsify&#xff0c;通过它能够将Markdown直接转换为网页。话不多说&#xff0c;下面直接介绍它的快速用法。 D…

(二)延时任务篇——通过redis的key监听,实现延迟任务实战

前言 本节内容是关于使用redis的过期key&#xff0c;通过开启其监听失效策略&#xff0c;模拟订单延迟任务的执行流程。其核心原理是通过使用redis订阅与发布的方式&#xff0c;将过期失效的key通过广播的方式&#xff0c;发布给客户端&#xff0c;客户端可以监听此消息进而消…