前端面试题---->JavaScript

const声明的对象属性和数组的值可以被修改吗?为什么

原因:当使用const声明一个对象或数组时,实际上是保证了对象或数组的引用不会被修改,但对象或数组本身的属性或元素是可以被修改的。这是因为const只能保证指向的内存地址不变,但并不保证内存地址指向的内容不变,而基本类型的变量在内存中存储的是值本身,而不是引用。

http和https协议

http(超文本传输协议):以明文方式发送内容,不提供任何方式的数据加密。

https(超文本传输安全协议):经过http通信,但利用SSL/TLS来加密数据包

加密方式:对称加密和非对称加密

1.对称加密:只有一个key

2.非对称加密:一对key服务端有公钥和私钥,服务器端将公钥发给客户端,客户端将内容用公钥加密发给服务端,服务端收到后用私钥解密获取内容,之后可以用获取的内容作为对称加密的key降低传输成本

tcp是基于连接的,

1.第一次握手:客户端向服务端发送SYN包

2.第二次握手:服务端同意连接,会回复SYN和ACK

3.第三次握手:客户端收到之后,会回复ACK包

4.连接建立

因为发送了三包数据,所以成为三次握手(之所以三次握手而不是两次,就是为了解决网络信道不可靠的问题

http(超文本传输协议):以明文方式发送内容,不提供任何方式的数据加密。

https(超文本传输安全协议):经过http通信,但利用SSL/TLS来加密数据包

图片懒加载的实现主要监测以下几个属性来判断是否要显示:

1. 可视区域:监测页面滚动事件或其他触发条件,判断图片是否进入了可视区域。可以通过计算图片元素与视口的位置关系来确定是否可见。

2. 滚动位置:监测页面滚动的位置,判断图片是否在用户正在浏览的范围内。可以获取滚动条的位置或计算元素的偏移量来判断图片是否在可视范围内。

3. 加载状态:监测图片的加载状态,判断图片是否已经加载完成。可以通过监听图片的"load"事件来检测图片是否成功加载。

4. 图片属性:监测图片元素的自定义属性或其他属性,判断是否需要加载该图片。可以在图片元素上设置自定义属性,例如"data-src"来保存图片的真实URL,然后根据需要进行加载。

通过监测这些属性,可以动态地判断图片是否需要加载和显示。当满足条件时,将图片的真实URL赋值给"src"属性,触发图片的加载和显示。这样可以实现图片的懒加载效果,延迟加载图片,提高页面加载速度和性能。

forEach和for循环区别:

1. 语法:forEach是数组的方法,需要通过数组对象调用,语法为:array.forEach(callback)。for循环是一种通用的循环方式,可以应用于数组和其他可迭代对象,语法为:for(initialization; condition; iteration)。

2. 遍历方式:forEach会自动遍历数组的每个元素,并将每个元素作为参数传递给回调函数。for循环可以自定义遍历的起始位置、结束条件和迭代方式。

3. 控制流程:forEach无法使用break和continue语句来控制循环的流程,一旦开始遍历,会一直执行直到遍历完所有元素。for循环可以使用break和continue语句来控制循环的流程,可以在满足某个条件时提前结束循环或跳过当前迭代。

4. 返回值:forEach没有返回值,它只是用来遍历数组。for循环可以有返回值,可以根据需要返回某个特定的值。

总的来说,forEach适用于需要遍历数组并对每个元素执行相同操作的情况,而for循环更加灵活,可以自定义循环的起始位置、结束条件和迭代方式,并且可以在循环中使用break和continue语句来控制流程。

异步加载(Asynchronous Loading)是指在网页加载过程中,将某些资源(如脚本、样式表、图片等)的加载与页面的渲染过程分离。通过异步加载,浏览器可以在加载资源的同时继续渲染页面,不会阻塞页面的展示。常见的异步加载方式包括使用

string类型转换为number类型的

隐式转换:

1.隐式转换:“-”、“*”、“/”

2.强制类型转换:Number、parseInt、parseFloat(当字符串一开始不是数字时,直接输出NaN)

Number()

注释:

  • 如果字符串中包含非数字或者是undefined,则会转换为NAN
  • 如果是一个空字符串或者NAN,则都会转换为0
  • boolean类型,true转为1,false转为0

parseInt()
parseFloat()

注释:

  • 可以从左向右将字符串中最先的连续的数字提取出来
  • 如果对于非string类型使用则会先转换为string类型,再做操作,例如;true会先变为'true'再变为NAN,而不是1

number转换为String类型的

  • a.toString()

注:null和undefined没有toString方法

  • String()

    this的指向问题

    在浏览器环境中,全局作用域中的this指向window对象。

    函数中的this:

    在函数中,this的值取决于函数的调用方式。

    如果函数作为对象的方法被调用,this指向调用该方法的对象。

    如果函数作为独立函数调用,this指向全局对象(浏览器环境中为window,Node.js环境中为global)。

    如果函数使用new关键字调用,this指向新创建的对象。

    箭头函数:this的指向是上级作用域

    如果函数使用call()、apply()或bind()方法调用,this指向作为参数传递的对象。

    箭头函数的this指向在定义时就确定了,因此无法通过call()、apply()或bind()方法来改变箭头函数的this指向。

    call、apply和bind的区别

    1.参数传递:call和apply的参数传递方式不同,call需要将参数逐个传递,而apply需要将参数封装成数组传递。bind方法则可以在绑定时传递参数,也可以在执行时传递参数。

    2.执行时机:call和apply会立即执行函数,而bind返回的是一个新函数,需要手动调用才会执行。

    3.返回值:call和apply的返回值是函数的执行结果,而bind返回的是一个新函数。

    块儿级作用域闭包的作用闭包的应用:

闭包可能存在的问题:内存泄漏(应该被回收的没有被回收) 

注释:闭包本身并不会直接导致内存泄漏,但不正确地使用闭包可能会导致内存泄漏的情况发生。

如果一个全局变量被赋值为一个函数,而这个函数正好一直用到嵌套函数里面的变量,就会导致变量不会被销毁,从而导致内存泄漏。

数组和集合的区别

1.元素的唯一性:数组中的元素可以重复,而集合中的元素是唯一的

2.动态性:数组的长度是固定的,一旦创建后不能改变。集合的长度是可变的

3.元素类型:数组可以存储任意类型的元素,包括基本类型和对象。集合通常只能存储对象类型的元素

4.存储方式:数组是一种有序的数据结构,每个元素通过索引访问。集合是一种无序的数据结构

严格模式通过禁用一些不安全的语法特性,强制执行一些最佳实践,提供更严格的错误检查和错误处理,以及优化JavaScript引擎的执行速度。

在JavaScript代码中,可以通过在脚本文件或函数体的开头添加"use strict";来启用严格模式。例如:

"use strict";

在严格模式下,一些常见的行为将被禁止,例如

变量必须先声明后使用

不允许使用未声明的变量

不允许对只读属性赋值

this在全局作用域下为undefined

混杂模式(Quirks Mode):

是指浏览器在渲染网页时使用的一种兼容旧版本浏览器的渲染模式。

在混杂模式下,浏览器会尽量兼容旧版本的HTML和CSS规范,以保证旧网页的正确显示。

在HTML文档的开头没有正确的DOCTYPE声明,或者根本没有DOCTYPE声明,浏览器将会触发混杂模式

link和@import区别:

1.link是HTML标签,@import是CSS语法规则,所以link比@import先被加载;

2.link支持使用JavaScript控制DOM去改变样式,而@import不支持。

setTimeout主要用于单次延迟执行,而setInterval用于持续重复执行。

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所做的密码变换。

虚拟DOM(virtual DOM)简称vdom,是一个普通的js对象,用来描述真实dom结构,因为它不是真实的DOM,所以称为虚拟DOM

localStorage中存储的数据没有过期时间,除非手动删除或清除浏览器缓存,否则数据会一直存在。而sessionStorage中存储的数据只在当前会话(当前窗口或标签页)有效,关闭窗口或标签页后数据会被清除。

localStorage和sessionStorage都是在客户端存储的,因此存储的数据对于用户来说是可见的,不适合存储敏感信息。

session、cookie和token的区别:

Session数据是存在服务器中的,cookie数据存放在浏览器当中,token是开发定义的,session是http协议规定的;

token可以跨域,session不可以跨域,它是与域名绑定的

promise、generator和async/await三者的区别:

三者都是为了解决异步产生的,之前通过回调函数解决异步,便出现了回掉地狱(callback hell)的问题:

没有顺序可言:嵌套函数执行带来的是调试困难,不利于维护与阅读

耦合性太强:一旦某一个嵌套层级有改动,就会影响整个回调的执行 

为了解决回掉地狱(callback hell)的问题,便出现了promise,它可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数,并且它的链式调用更能让人接受,也符合我们同步的思想,但它的缺点是:

Promise的内部错误使用try catch捕获不到,因为当异步函数抛出异常时,对于宏任务    (setTimeout、setInterval、Ajax、Dom事件)而言,执行函数时已经将该函数推入栈,此时并不在 try-catch 所在的栈,所以 try-catch 并不能捕获到错误。对于微任务(Promise、async/await)而言,比如 promise 的构造函数的异常只能被自带的 reject 也就是.catch 函数捕获到。

1.Generator函数可以通过yield关键字来暂停和恢复函数的执行,从而可以更灵活地控制异步操作的执行顺序。而Promise是通过then()方法来处理异步操作的结果,不能直接控制异步操作的执行顺序。

2.错误处理:Generator需要手动在代码中编写错误处理逻辑,通常使用try-catch语句来捕获和处理错误。而async/await可以直接在异步函数内部使用try-catch语句来捕获和处理错误,使错误处理更加简洁。Promise通过catch()方法来处理操作的失败。

3.Generator函数可以通过yield语句返回多个值,每次调用next()方法都会返回一个新的值。而Promise只能返回一个结果值。

4.Generator需要手动调用next()方法来控制异步操作的执行和恢复。而async/await会自动等待Promise对象的解析,使得异步操作的执行更加简单和直观。Promise通过resolve()和reject()方法来控制异步操作的状态

实现浅拷贝的方法有:

  1. 赋值操作符(=)
  2. 扩展运算符方式:cloneObj = {...obj};cloneArr= [...arr]

实现深拷贝的方法有:

1.JSON.parse(JSON.stringify()):利用JSON的序列化和反序列化操作,可以实现简单的深拷贝。通过将对象或数组转换为JSON字符串,再将JSON字符串转换回对象或数组,就可以得到一个全新的对象或数组。这种方法简单易用,但不能复制特殊类型的对象,如函数、正则表达式和特殊类型的对象

2.如lodash的cloneDeep()方法

3.递归复制

JSON.stringify()和JSON.parse()的区别

注:在使用JSON.parse()需要注意一点,由于此方法是将JSON字符串转换成对象,所以你的字符串必须符合JSON格式

正则表达式

防抖和节流的异同

防抖和节流都是用于控制函数的执行频率,但它们的实现方式和应用场景有所不同。

防抖(Debounce)的实现思路是在事件触发后,等待一段时间(如300毫秒),如果在这段时间内没有再次触发事件,则执行函数。如果在等待时间内又触发了事件,则重新计时。防抖适用于一些频繁触发的事件,比如窗口大小改变、搜索框输入等,可以减少函数的执行次数,提升性能。

节流(Throttle)的实现思路是在事件触发后的一段时间内,只执行一次函数。比如每隔300毫秒执行一次函数。节流适用于一些高频触发的事件,比如滚动事件、鼠标移动事件等,可以控制函数的执行频率,避免过多的计算和渲染。

区别:

1. 触发频率:防抖是在事件触发后等待一段时间执行函数,节流是在一段时间内只执行一次函数。

2. 执行时机:防抖是在事件停止触发后执行函数,节流是在一段时间内定时执行函数。

3. 应用场景:防抖适用于频繁触发的事件,节流适用于高频触发的事件。

4. 执行次数:防抖可能会在事件停止触发后执行一次或多次函数,节流在一段时间内只执行一次函数。

预处理语言

预处理语言在编辑样式方面提供了更多的功能和灵活性,使得样式的编写更加高效、可维护和可复用。它们提供了一些高级特性,帮助开发者更好地组织和管理样式代码,并提供了更多的工具和技术来增强样式的表现力和适应性。

作用域链

原型链 

事件冒泡:

通过给子元素和父元素添加绑定事件,当点击子元素的时候,先触发子元素的事件绑定,然后在冒泡到父元素,进而触发父元素的事件绑定

事件代理:

如果要操作的子标签过多,可以选择绑定父标签,然后在通过event.target判断触发事件的元素是否是你要的子元素,然后再进行操作

简述页面从发送http请求到渲染页面的全过程

  1. 用户在浏览器输入URL并按下回车键,浏览器开始解析URL,根据协议(通常是HTTP或HTTPS)发起对服务器的请求。
  2. 浏览器向DNS服务器查询域名对应的IP地址,获取服务器的IP地址。
  3. 浏览器利用获取到的IP地址与服务器建立TCP连接,通过三次握手建立连接。
  4. 建立TCP连接后,浏览器向服务器发送HTTP请求,请求中包含请求的资源、请求方法(GET、POST等)、请求头等信息。
  5. 服务器接收到请求后,根据请求的资源和方法进行处理,然后返回HTTP响应给浏览器。响应中包含状态码、响应头和响应体等信息。
  6. 浏览器接收到服务器返回的HTTP响应后,开始解析响应头和响应体。根据响应头中的信息判断响应的类型(如HTML、CSS、JavaScript等)。
  7. 如果响应是HTML类型,浏览器开始解析HTML文档,构建DOM树;解析CSS文件,构建CSSOM树;执行JavaScript代码,生成页面所需的DOM树和CSSOM树。
  8. 浏览器根据DOM树和CSSOM树结合渲染引擎(如WebKit、Blink等)进行页面布局和绘制,最终将页面内容呈现给用户。
  9. 用户在浏览器上看到页面内容,与页面交互,完成整个页面加载和渲染的过程。

简述JavaScript的同源策略

JavaScript的同源策略是一种浏览器安全策略,用于限制一个网页中的脚本只能与来自同一源(协议、域名、端口号都相同)的资源进行交互,防止恶意网站通过脚本获取用户的敏感信息或对其他网站进行攻击。

常见的HTTP响应状态码包括:

1xx(信息性状态码)

指示请求已被接收,继续处理。

  • 100 Continue:服务器已经收到请求的一部分,客户端可以继续发送剩余部分。
  • 101 Switching Protocols:服务器将遵从客户的请求转换到另外一种协议。

2xx(成功状态码)

指示请求已成功接收、理解、接受或处理。

  • 200 OK:请求成功。
  • 201 Created:请求已经被实现,新资源已经创建。
  • 204 No Content:服务器成功处理请求,但没有返回任何内容。

3xx(重定向状态码)

需要客户端执行进一步的操作才能完成请求。

  • 301 Moved Permanently:请求的资源已被永久移动到新位置。
  • 302 Found:请求的资源临时移动到新位置。

4xx(客户端错误状态码)

指示客户端发送的请求有错误。

  • 400 Bad Request:请求无效。
  • 403 Forbidden:服务器拒绝请求。
  • 404 Not Found:请求的资源不存在。

5xx(服务器错误状态码)

指示服务器在处理请求时发生错误。

  • 500 Internal Server Error:服务器内部错误。
  • 503 Service Unavailable:服务器暂时不可用。

HTTP响应状态码可以帮助开发人员诊断和解决问题,同时也可以向用户提供有用的信息。根据不同的状态码,客户端和开发人员可以了解请求的处理情况,并采取相应的措施。

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

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

相关文章

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV),或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…

c++AVL树

cAVL树 1. 前言 map/multimap、set/multiset这几个容器的共同点是:它们的底层都是按照搜索二叉树来实现的,但是搜索二叉树存在一个缺陷:如果往树中插入的元素有序或接近有序,二叉树搜索就会退化成单支树,时间复杂度会…

Vuex笔记

Vuex vuex 是实现数据集中式状态管理的插件。数据由 vex 统一管理。其它组件都去使用 vuex 中的数据。只要有其中一个组件去修改了这个 共享的数据,其它组件会同步更新。 多个组件之间依赖于同一状态。来自不同组件的行为需要变更同一状态。 环境搭建 1、vue2安…

Linux虚拟机环境搭建spark

Linux环境搭建Spark分为两个版本,分别是Scala版本和Python版本。 一、 安装Pyspark 本环境以 Python 环境为例。 1、下载spark 下载网址:https://archive.apache.org/dist/spark 下载安装包:根据自己环境选择合适版本,本环境…

BitMap介绍与应用

文章目录 BitMapBitMap介绍BitMap 结构RoaringBitmap 常见BitMapJava中的BitSetRedis中的BitMapClickHouse中的BitMap BitMap应用案例人群圈选 BitMap 场景一:(大部分开发面试都会遇到的一个问题) 有10亿个用户id (int类型),判断用户是否登…

自养号测评:如何助力跨境电商平台亚马逊、速卖通等店铺提升产品权重

对于卖家而言,爆款产品不仅意味着源源不断的流量,更是店铺销量增长的强有力保障。因此,多数卖家都积极学习如何打造爆款产品,特别是那些希望将店铺运营得风生水起的卖家们。那么,如何在激烈的市场竞争中打造出具有创新…

题解 P3295 【[SCOI2016]萌萌哒】

先引用一下这位大佬的题解,对此我再进行细化 题解 P3295 【[SCOI2016]萌萌哒】 - 洛谷专栏https://www.luogu.com.cn/article/it7foeu6并查集 首先是如何想出来需要并查集处理,下面是n8,第一组约束条件是[1,4]和[5,8],如下图&am…

算法的时间复杂度与空间复杂度

俗话说“条条大路通罗马”, 我们在用算法解决某一个问题时,往往会存在多种解决方法,但正如道路有远近之分,不同的算法也应该是有优劣的。为了更加清晰的量化算法的优劣,我们就需要引入算法的时间复杂度与空间复杂度了。…

我的 Android 性能书上架了!内附书籍介绍

大家好,我是拭心。 很高兴地向大家宣布,我的新书《Android 性能优化入门与实战》上架了! 点击下面的小程序进行购买: 封面介绍 这本书的封面来自之前的投票文章 # 投票啦!最新安卓进阶书籍封面由你来定,从四…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇: 欢迎来到设计模式的神秘…

Unity 打包真机脚本丢失的问题

记录Bug Bug详情分析解决方案附录 Bug详情 项目中导入了UI Particle的Package,用于处理特效层级 unity 运行效果正常,打包真机后运行时发现特效并没有正确显示,真机Log如下图 需要接入查看真机Log工具的点这里 查看图中Log发现对应的Prefab上挂载的脚本…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 程序员职业生涯的分水岭:年龄还是经验?引言技术更新换代…

邮件营销工具的必备功能?如何选营销工具?

邮件营销工具的效果如何?营销工具怎么提升邮件营销? 一款优秀的邮件营销工具,不仅能够帮助企业高效地进行邮件发送,还能通过精准的数据分析和用户行为跟踪,提升营销效果。AokSend将探讨邮件营销工具的必备功能。 邮件…

Python机器学习赋能GIS:地质灾害风险评价的新方法论

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…

鉴源论坛丨形式化工程方法之需求建模(下)

作者 | 杨坤 上海控安可信软件创新研究院系统建模组 版块 | 鉴源论坛 观模 引言:需求建模是一种从源头确保软件质量的重要手段。需求建模可分为需求规约和需求确认两个部分,前者通过严格设计的形式化语言精确地将需求文档转换为了形式化规约&#xff0…

PASSL代码解读[01] readme

介绍 PASSL 是一个基于 PaddlePaddle 的视觉库,用于使用 PaddlePaddle 进行最先进的视觉自监督学习研究。PASSL旨在加速自监督学习的研究周期:从设计一个新的自监督任务到评估所学的表征。 PASSL 主要特性: 自监督前沿算法实现 PASSL 实现了…

为什么requests不是python标准库?

在知乎上看到有人问:为什么requests不是python标准库? 这确实是部分人困惑的问题,requests作为python最受欢迎的http请求库,已经成为爬虫必备利器,为什么不把requests直接装到python标准库里呢?可以省去第…

学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟,首先要下载joy功能包,发布sensor_msgs话题也就是手柄和ros通信的话题。 下载的步骤就根据官方文档即可 joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki 这里我提供一下具体步骤 第一步 安装joy 首先安装对应系统版本的…

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据,有一元运算符和二元运算符之分。 一元算术运算符有两个:(正号)和-(负号),例如&#xff1…

SV-7041VP SIP塑料壳sip音箱支持POE供电(白色弧形)

SV-7041VP SIP塑料壳sip音箱支持POE供电 (白色弧形) 一、描述18123651365微信 SV-7041VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可…