JS 面试整理

news2024/10/6 16:57:42

1.JS运行机制(EventLoop事件循环)

  • Js是单线程,每次只能执行一项任务,其他任务按照顺序排队等待,使用eventloop来解决线程阻塞的问题。
  • 在执行栈过程中,有同步代码和异步代码时,首先会执行完所有的同步代码,异步代码分类添加到宏任务队列或微任务队列中。 
  • 先微后宏,先执行微任务(promise、async、await、nextTick),再执行宏任务(setTimeOut、setInterval)。
  • 执行栈执行完再从任务队列取出任务,再按规则执行,反复循坏就是EventLoop。

2.原型和原型链

  • 每个函数都有一个prototype属性,这个属性称为显示原型,它指向的是一个对象,这个对象就是原型对象;
  • 原型对象是用来存放实例对象的共有属性和公有方法的,它有个constructor属性,指向它的构造函数,每个实例对象都有_ _proto_ _属性,被称为隐式原型
  • 通过_ _proto_ _链接起来的链式结构就称为原型链,查找属性时沿着原型链向上查找,直到它的最顶层Object.prototypeproto属性值为null
  • 构造函数是使用new关键字的函数,用来创建对象,所有函数都是Function()的实例;let fun1 = new Person(name,age); function Person(name,age){ };
  • Function instanceof Object => true;Object instanceof Function => true;

 

3.栈和堆

  • 栈是一种连续存储的数据结构,先进后出;要读取栈中的某个元素,要将其之前所有元素出栈才能完成;
  • 栈内存用于存放临时变量,主要存储各种基本类型的变量,Boolean、number、string、undefined、null;
  • 栈内元素只能通过栈顶访问,另一端为栈底;

  • 堆是非连续的树形存储数据结构,先进先出
  • 堆内存存储没规律可言,主要负责对象Object类型的存储;

  • 栈系统效率较高,堆内存需要分配空间和地址,还要把地址存到栈中,效率低;
  • 栈内存中变量当执行环境结束就会被销毁被垃圾回收制回收,堆内存中的变量只在所有对它引用都结束时才会被回收;

4.深拷贝和浅拷贝

  • 深拷贝和浅拷贝主要针对的是对象(引用类型)

  • 浅拷贝只拷贝了地址,并没有拷贝数据,所以其中一个改变,另一个随之改变;深拷贝拷贝了地址和数据,互不影响;
  • 浅拷贝实现方式:Object.assign()、Array.prototype.slice()、Array.prototype.concat()、解构、扩展运算符(…);
  • 深拷贝实现方法:JSON.parse(JSON.stringify())、递归;

5.防抖和节流 

  • 防抖:事件触发后,在n秒后执行回调,在这n秒内再次被触发,则重新计时;(输入框联想功能、短信验证码、提交表单)
  • 节流:规定时间内只能触发一次函数,如果多次触发,只生效一次;(scroll事件、播放计算进度条事件、)
//节流throttle代码:
function throttle(fn,delay) {
    let canRun = true; 
    return function () {
        if (!canRun) return;
        canRun = false; 
        setTimeout(() => { 
            fn.apply(this, arguments);
            canRun = true;
        }, delay);
    };
}
//防抖debounce代码:
function debounce(fn,delay) {
    var timeout = null; 
    return function (e) { 
        clearTimeout(timeout); 
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}
  •  设置echarts防抖,保证拖动窗口大小,只执行一次获取浏览器宽高的方法;
  • 地图层级变化时,利用防抖,地图层级变化完成再执行撒点操作;
  • 全景图片查看,利用防抖,快速点击后查看最后一次点击的图片;
  • 查看文档、下载功能,利用节流,在规定时间内,只加载一次文档或只执行一次下载功能;

6.数据类型及判断 

  •  基本数据类型(8种):string、number、null、undefined、boolean、symbol、bigint,bigint支持比number范围更大的整数值数据类型;
  • 所有基本类型Boolean值为false的只有6个:0、NaN、’ ’、null、undefined、false;
  • &&=>都是true才是true;||=>有一个true就是true;!=>取反;
  • typeof判断基本数据类型,typeof null类型是object
  • instanceof只能判断引用数据类型,运行机制是判断其在原型链中能否找到该类型的原型,[ ] instanceof Array => true,不能检测null、undefined
  • constructor适用于基本和引用数据类型,(true).constructor => Boolean;
  • Object.prototype.toString.call();
  • null==undefined => true; null===undefined => false;NaN==NaN =>false;
  • objected.is(+0,-0)=>false;onjected.is(NaN,NaN)=>true;

 7.垃圾回收机制(GC) 

  • 浏览器的js具有自动回收垃圾机制,垃圾收集器会按照固定的时间间隔,周期性的找出不使用的变量,然后释放内存,防止内存泄漏;
  • 垃圾回收方法:引用计数法、标记清除法;
    • 引用计数法(现代主流浏览器不再用):看一个对象是否有指向它的引用;跟踪记录每个值被引用的次数,被引用一次就记录一次,多次引用就累加,减少1个引用就减1,如果引用次数为0,则释放内存;缺点:如果两个对象回想引用,但是两个都没有使用;
    • 标记清除法:从根部出发定时扫描内存中的对象,凡是能从根部到达的对象,都还是需要使用的,那些无法由根部出发触及的对象,标记为不再使用,销毁掉标记的值,回收它们的内存空间;
  • 内存泄漏:程序已经动态分配的堆内存由于某些原因没有得到释放,造成系统内存浪费,导致程序运行速度减慢,甚至系统崩溃;
  • 导致内存泄漏:闭包、定时器、DOM

8.数组去重 

  •  Set方法,form浅拷贝数组

 function unique(arr){

    return Array.from(new Set(arr))

}

  • 双重for循环

function unique(arr){

        let newArr:any = [];

        for(let i=0;i<arr.length;i++){

                let repeat:boolean = false;

                for(let j=0;j<newArr.length;j++){

                        if(arr[i]===newArr[j]){

                                repeat = true;

                                break;

                        }

                }

                if(!repeat) newArr.push(arr[i]);

                }

        return newArr;

}

  • 数组splice方法 

function unique(arr){

    for(var i=0;i<arr.length;i++){

        for(var j=i+1;j<arr.length;j++){

            if(arr[i]==arr[j]){

                arr.splice(j,1);

                j--;

            }

        }

    }

    return arr;

}

  • 利用filter方法

function unique(arr){

        let newArr = arr.filter((it,index)=>{

                return arr.indexOf(it) = index;

        })

        return newArr;

}

  • 利用includes方法

function unique(arr){

        let newArr:any[] = [];

        for(let i=0;i<arr.length;i++;){

                if(!newArr.includes(arr[i])){

                        newArr.push(arr[i]);

                }

        }

        return newArr;

}

  • 利用对象

function unique(arr){

        let newArr:any[] = [];

        let obj:any = {};

        arr.forEach(it=>{

                if(!obj[it]){

                        newArr.push(it);

                        obj[it] = true;

                }

        });

        return newArr

}

  • 利用indexOf方法

function unique(arr){

        let newArr:any[] = [];

        for(let i=0;i<arr.length;i++;){

                if(newArr.indexOf(arr[i])==-1){

                        newArr.push(arr[i]);

                }

        }

        return newArr;

}

9.cookie,localstorage,sessionstorage 的区别 

  • cookie:可设置失效时间,不设置则默认关闭浏览器后失效;4KB左右,每次都会携带在http头中,使用cookie保存过多会带来性能问题;
  • localstorage:永久保存,除非手动清除;大小5MB
  • sessionStorage:仅在当前网页回话下有效,关闭页面或浏览器被清除,资源不共享,大小5MB。

10.事件

  • 事件是文档和浏览器窗口发生的特定的交互瞬间,事件就发生了;
  • 事件类型:事件捕获事件冒泡
    • 事件捕获:由外向内,从事件发生的顶点开始,逐级往下查找,直到目标元素;
    • 事件冒泡:由内向外,从目标元素触发,逐级向上传递,直到根节点;
  • 事件流:页面接受事件的先后顺序;
  • 事件委托(事件代理):利用事件冒泡,把子元素的事件绑定到父元素上,如果子元素阻止了事件冒泡,则事件委托无法实现;
  • event.stopPropagation().stop;
  • addEvtentListener(‘click’,函数名,true/false);默认为false(事件冒泡),true为事件捕获;

 11.重绘和回流(重排)

  • 重绘:元素样式改变不改变布局,浏览器重绘对元素进行更新,如颜色改变;
  • 回流:元素的大小、结构变化,浏览器重新渲染页面,如width,height改变;

 12.网页从开始到加载过程

  • 输入网址后做域名解析
  • 根据ip地址查找服务器,开始请求数据
  • 服务器返回数据,浏览器开始解析
  • 浏览器再次请求页面中使用的资源文件
  • 解析展示整个页面

13.浏览器渲染引擎工作原理和流程

  • 打包出来的 HTML、CSS、JavaScript 等文件,经过浏览器运行之后就会显示出页面,这个过程就是浏览器的渲染进程来操作实现的,渲染进程的主要任务就是将静态资源转化为可视化界面;
  • 5个步骤:
    • DOM树构建:使用HTML解析器解析HTML文档,将每个HTML元素转化为DOM节点,生成DOM树;
    • CSSOM树构建:CSS解析器解析CSS,转化为CSS对象再组装起来,构建CSSOM树;
    • 渲染树构建:DOM树和CSSOM树构建完后,浏览器根据这两棵树构建一棵渲染树;
    • 页面布局:渲染树构建后,浏览器会计算出元素的大小和位置;
    • 页面绘制:页面布局完后,浏览器把每个页面转换为像素,并对所有媒体文件进行解码

 14.字符串方法

  • str.concat():拼接字符串;(不如用模板字符串代替)
  • str.slice(startIndex,endIndex):截取字符串,不包括endIndex处元素;
  • str.substring(startIndex,endIndex):两个参数为负数或者NaN都会被当做0,如果大于字符串的长度则会被当做字符串的长度来计算,如果 startIndex 大于 endIndex,则 substring 的执行效果就像两个参数调换了一样;
  • str.trim():删除字符串两端的空白符;
  • str.toLowerCase():字符串值转为小写;
  • str.toUpperCase():字符串值转为大写形;
  • str.replace(正则要替换的元素,要替换的新的元素):返回替换后的新字符串;
  • str.split():可以使用一个指定的分隔符来将字符串拆分成数组,返回一个数组;
  • str.charAt(index):从一个字符串中返回指定的字符;
  • str.includes():是否包含指定字符,包含返回true,否则返回false;
  • str.indexOf():是否包含指定字符,包含则返回index,不包含返回-1;
  • str.lastIndexOf():用法和indexOf相同, lastIndexOf()是从后往前查找;
  • str.search():使用正则表达式查找指定字符串,找到返回首次匹配成功的index,没找到返回-1;
  • str.match():返回一个字符串匹配正则表达式的结果,如果未设置全局匹配,则会返回第一个完整匹配及其相关的捕获组,捕获组中包含有groups、index、input等属性

15.数组方法 

  • 改变原数组
    • push():数组末尾添加元素;
    • pop():删除数组最后一个元素;
    • shift():删除头部元素;
    • unshift():数组开头添加;
    • sort():排序,arr.sort((a,b)=>a-b);升序;
    • splice():splice(0,1)从第一个元素开始截取一个元素;
    • reverse():原数组倒序;
    • forEach():遍历数组;
  • 返回新数组
    • concat():合并数组;
    • slice():提取数组slice(1,2),1起2止,止不算;
    • join():数组分割为字符串;
    • toString():数组转字符串;
    • map():没有return时,只遍历数组;
    • filter():返回满足条件的元素组成的数组;
    • every():每个元素都满足条件返回true;
    • some():有一个元素满足条件返回true;
    • find():返回第一个满足条件的元素;
    • findIndex():返回第一个满足条件的下标,没有则返回-1;
    • indexOf():从前往后找,返回当前查找的下标,没有返回-1;
    • lastIndexOf():从后往前找,返回第一个满足的下标,没有返回-1;
    • reduce():4个参数,arr.reduce((prev,cur,index,arr)=>{},init);(arr: 表示将要原数组;prev:表示上一次调用回调时的返回值,或者初始值init;cur:表示当前正在处理的数组元素;index:表示正在处理的数组元素的索引,若提供init值,则索引为0,否则索引为1;init: 表示初始值).例:计算数组中每个元素出现的次数数组扁平化
    • includes():是否包含指定值,includes(a,b);a为查找元素,b为查找起始索引;包含返回true,否则false;
    • flat():数组扁平化,可去除空项;
    • fill():填充一个数组;fill(value,start,end);填充值,开始填充位置,结束位置;
    • Array.from():将对象或字符串转为数组;

批量生成测试数据:

Array.from({length:100}).map(it,index)=>{return {id:index,name:’test’+index}};

16.ES6新特性

  • 模板字符串、箭头函数、promise、const/let、解构赋值、扩展运算符(…)、class类的继承、Symbol、Map;                

17.浏览器线程 

  • JS 引擎线程:单线程,负责解析运行 JavaScript 脚本。和 GUI 渲染线程互斥,JS 运行耗时过长就会导致页面阻塞。
  • GUI 渲染线程:负责渲染页面,解析 HTML,CSS 构成 DOM 树等,当页面重绘或者回流都会调起该线程。和 JS 引擎线程是互斥的,当 JS 引擎线程在工作的时候,GUI 渲染线程会被挂起,GUI 更新被放入在 JS 任务队列中,等待 JS 引擎线程空闲的时候继续执行。
  • 事件触发线程:当事件符合触发条件被触发时,该线程会把对应的事件回调函数添加到任务队列的队尾,等待 JS 引擎处理。
  • 定时器触发线程:浏览器定时计数器并不是由 JS 引擎计数的,阻塞会导致计时不准确。开启定时器触发线程来计时并触发计时,计时完成后会被添加到任务队列中,等待 JS 引擎处理。
  • http 请求线程:http 请求的时候会开启一条请求线程,请求完成有结果了之后,将请求的回调函数添加到任务队列中,等待 JS 引擎处理。

待更新......

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

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

相关文章

Linux学习笔记 --- 初识Linux

PC操作系统&#xff0c;也就是个人电脑所使用的操作系统 一. 操作系统概述 导学&#xff1a;了解操作系统的作用&#xff0c;了解常见的操作系统有哪些 1.1 硬件和软件 说白了&#xff0c;硬件就是你看得见&#xff0c;摸得到的。 1.2 操作系统 1.3 常见操作系统 PC操作系统…

分布式消息队列-RabbitMQ从入门到精通

文章目录 分布式消息队列认知提升分布式消息队列&#xff08;MQ&#xff09;应用场景分布式消息队列&#xff08;MQ&#xff09;应用思考点MQ本身的一些思考点业界主流的分布式消息队列&#xff08;MQ&#xff09;MQ的技术选型关注点初识 JMS 与其专业术语 RabbitMQ四种集群架构…

程序员:面试造火箭,入职拧螺丝?太难了···

刚开始工作的时候&#xff0c;我也想不通这个问题&#xff0c;甚至很鄙视这种现象。后面当了面试官&#xff0c;做到了公司中层管理&#xff0c;也会站在公司以及行业角度去重新思考这个问题。 为什么这种现象会越来越普遍呢&#xff1f;尤其在 IT 行业愈加明显。 面试看的是…

抖音SEO源码开发:技术分享与实践

抖音SEO源码开发一直是数字营销领域的重要技术之一。它可以帮助企业在搜索引擎结果页面上获得更好的排名&#xff0c;从而吸引更多的用户。为了帮助更多的企业提升在抖音平台上的曝光率&#xff0c;开发者们分享了自己的技术并进行了实践。 在抖音SEO源码开发的过程中&#xf…

Pytho制作自动更换壁纸程序,快来给你的电脑开启无限换肤吧

目录 前言环境使用:需导入的模块一. 获取壁纸二. 设置自动更换尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: Python 3.8 解释器 Pycharm 编辑器 需导入的模块 import re # 正则表达式模块 import requests >>> pip install r…

oracle数值型函数大全(不包含三角函数)

--数值型函数大全 --1.abs(x) 返回x的绝对值 select abs(-2.1) from dual; --2.mod(x,y) 取余 select mod(5,2) from dual; --3.sign(x) 返回正负值 --x>o,则返回1 select sign(10) from dual; --x0,则返回0 select sign(0) from dual; --x<0,则返回-1 sele…

typora怎么把本地固定目录下的图片拷贝到相对目录,怎么分享图片(图片分享)

如图&#xff0c;我的这张图片是存在固定目录下的&#xff0c;我把这个.md文件分享给别人&#xff0c;别人就看不到图片了 我们只需要点击图片按钮&#xff0c;并点击“将图片复制到到…”或者“将图片移动到…” 然后图片就被拷贝到这里来了&#xff1a; 把这个目录连同我们的…

MATLAB | 实用(离谱)小技巧大合集:仅隐藏轴线 | 复杂公式刻度标签 | 渐变背景 | 半透明图例... ...

看到阿昆的科研日常写了一篇如何将轴线隐藏而不隐藏刻度的推送&#xff0c;使用了XRuler中的Axle对象来实现&#xff0c;但我试了一下R2023A版本中不太能直接用&#xff0c;解决了一下&#xff0c;同时讲一下这些有趣的隐藏对象及其其他的用法。 1 隐藏轴框线 假设我们编写了如…

Win10“我的电脑”图标不见了,恢复方法

Win10“我的电脑”图标不见了&#xff0c;恢复方法 当使用电脑时&#xff0c;若‘我的电脑’图标在桌面不显示&#xff0c;使得对电脑各个盘区文件的查找和打开带来不便&#xff0c;本文将以Win10为例子&#xff0c;介绍桌面图标不显示的处理恢复方法。 具体的恢复方法如下 1…

pdf怎么转jpg?转换途径分享

PDF 转 JPG 是一种常用的数字图像处理技术&#xff0c;它可以帮助我们将 PDF 文件转换为 JPG 图像&#xff0c;从而更好地存储或传输文件。在实际应用中&#xff0c;PDF 转 JPG 有许多优点&#xff0c;例如可以节省存储空间、提高文件传输速度&#xff0c;以及增强文件的可读性…

Netty实战(六)

ChannelHandler和ChannelPipeline 一、ChannelHandler1.1 Channel 的生命周期1.2 ChannelHandler 的生命周期1.3 ChannelInboundHandler 接口1.4 ChannelOutboundHandler 接口1.5 ChannelHandler 适配器1.6 资源管理 二、ChannelPipeline 接口2.1 修改 ChannelPipeline2.2 触发…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…

Linux知识点 -- 进程概念(一)

Linux知识点 – 进程概念&#xff08;一&#xff09; 文章目录 Linux知识点 -- 进程概念&#xff08;一&#xff09;一、冯诺伊曼体系结构二、操作系统&#xff08;OS&#xff09;1.概念2.设计OS的目的3.如何理解管理4.系统调用和库函数的概念 三、进程概念1.理解进程2.描述进程…

Windows源码安装INDEMIND双目惯性模组

最近电赛准备在Win10的平台上做一个增强现实眼镜&#xff0c;所以IMU相机也是必不可少的传感器&#xff0c;记录Windows源码安装INDEMIND双目惯性模组。 文章目录 实验环境一、配置准备1、SDK下载及准备安装2、安装CMake并添加环境变量3、设置".sln"文件的默认打开方…

区块链服务网络发展联盟最新成员单位名单公布

原标题&#xff1a;《BSN发展联盟第六批入盟成员单位及全体联盟成员名单公示》 为了更好地推动BSN的发展&#xff0c;国家信息中心、中国移动通信集团有限公司、中国银联股份有限公司、北京红枣科技有限公司共同发起成立了区块链服务网络发展联盟&#xff08;Blockchain-based…

六、AOP(2)

一、AOP操作&#xff08;AspectJ注解&#xff09;重点 1.创建类&#xff0c;在类里面定义方法com.zhilei.spring5.aopanno public class User {public void add(){System.out.println("add...");} }2.创建增强类&#xff0c;编写增强逻辑 在增强类里面&#xff0c…

基于LC3模拟器的简单游戏设计:简易四子棋

一、实验目的 分析和理解指定的需解决问题。利用LC-3的汇编代码设计实现相关程序。通过LC-3仿真器调试和运行相关程序并得到正确的结果。 二、实验内容 四子棋是一款普遍流行的简易型桌面游戏&#xff0c;据说&#xff0c;虎克船长曾因专注于此游戏而长期隐身在住所&#xf…

如何绘制算法流程图?常见渠道一览

算法流程图是一种用于描述算法执行流程的图形化工具&#xff0c;它通常将算法的执行过程分解成若干个步骤&#xff0c;并通过线条连接这些步骤&#xff0c;形成一个完整的流程图。在计算机科学和信息技术的发展过程中&#xff0c;算法流程图已经成为了一种非常有用的工具&#…

ThreadLocal为什么容易内存泄露?

文章目录 一、Java的四种引用二、ThreadLocal为什么容易内存泄露&#xff1f;三、源码 一、Java的四种引用 1、强引用&#xff1a;强引用在程序内存不足&#xff08;OOM&#xff09;的时候也不会被回收 2、软引用&#xff1a;软引用在程序内存不足时&#xff0c;会被回收 3、弱…

前端axios fetch 解决接口请求响应数据返回快慢不均导致的数据错误问题

引言 搜索功能&#xff0c;我想很多业务都会涉及&#xff0c;这个功能的特点是&#xff1a; 用户可以在输入框中输入一个关键字&#xff0c;然后在一个列表中显示该关键字对应的数据&#xff1b;输入框是可以随时修改/删除全部或部分关键字的&#xff1b;如果是实时搜索&…