前端面试官常问javaScript编程题,隔壁王大爷看了都会了

目录

 

1.数组排序。

2.数组元素的去重;

3.用递归的方法求数组的求和;

4.防抖节流的思路。

5.深拷贝、浅拷贝;

6.做一个10秒的倒计时;

7.setTimeout()和setInterval()的使用以及区别


导读:一些常见的前端面试官会让求职者写的编程题

 

1.数组排序。

sort() 方法以字母顺序对数组进行排序

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();

使用相同的技巧对数组进行降序排序:

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});


2.数组元素的去重;

利用ES6 Set去重(ES6中最常用)

function unique (arr) {return Array.from(new Set(arr))
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

利用for嵌套for,然后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]){         //第一个等同于第二个,splice方法删除第二个arr.splice(j,1);j--;}}}
return arr;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];console.log(unique(arr))//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     //NaN和{}没有去重,两个null直接消失了

更多数组去重:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest

 

3.用递归的方法求数组的求和;

递归

var arr = [1,2,3];
function sum(arr) {if(arr.length == 0){return 0;} else if (arr.length == 1){return arr[0];} else {return arr[0] + sum(arr.slice(1));}
}
console.log(sum(arr));//6

for循环

var arr = [1,2,3];
function sum(arr) {var s = 0;for (var i = 0;i<arr.length;i++) {s += arr[i];}return s;
}
console.log(sum(arr));//6


4.防抖节流的思路。

防抖

函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。

比如:坐电梯的时候,如果电梯检测到有人进来(触发事件),就会多等待 10 秒,此时如果又有人进来(10秒之内重复触发事件),那么电梯就会再多等待 10 秒。在上述例子中,电梯在检测到有人进入 10 秒钟之后,才会关闭电梯门开始运行,因此,“函数防抖”的关键在于,在 一个事件 发生 一定时间 之后,才执行 特定动作

函数防抖的要点,是需要一个 setTimeout 来辅助实现,延迟运行需要执行的代码。如果方法多次触发,则把上次记录的延迟执行代码用 clearTimeout 清掉,重新开始计时。若计时期间事件没有被重新触发,等延迟时间计时完毕,则执行目标代码。

function debounce(fn,wait){var timer = null;return function(){if(timer !== null){clearTimeout(timer);}timer = setTimeout(fn,wait);}
}function handle(){console.log(Math.random());
}window.addEventListener("resize",debounce(handle,1000));

节流

函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。节流通俗解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴。

函数节流主要有两种实现方法:时间戳和定时器。

时间戳

var throttle = function(func, delay) {            var prev = Date.now();            return function() {                var context = this;                var args = arguments;                var now = Date.now();                if (now - prev >= delay) {                    func.apply(context, args);                    prev = Date.now();                }            }        
}        
function handle() {            console.log(Math.random());        
}        
window.addEventListener('scroll', throttle(handle, 1000));

定时器

var throttle = function(func, delay) {            var timer = null;            return function() {                var context = this;               var args = arguments;                if (!timer) {                    timer = setTimeout(function() {                        func.apply(context, args);                        timer = null;                    }, delay);                }            }        
}        
function handle() {            console.log(Math.random());        
}        
window.addEventListener('scroll', throttle(handle, 1000));

函数防抖:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。


5.深拷贝、浅拷贝;

深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

浅复制

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);function shallowCopy(src) {var dst = {};for (var prop in src) {if (src.hasOwnProperty(prop)) {dst[prop] = src[prop];}}return dst;
}

因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arr 和 shallowObj.arr 指向同一块内存地址。

shallowObj.arr[1] = 5;
obj.arr[1]   // = 5

而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。

需要注意的是,如果对象比较大,层级也比较多,深复制会带来性能上的问题。在遇到需要采用深复制的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅复制更为常用。

6.做一个10秒的倒计时;

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title>
</head>
<script type="text/javascript">function daojishi(){var starttime=document.getElementById("id2").innerText;if(starttime==0){return ;}setTimeout("daojishi()",1000);starttime--;document.getElementById("id2").innerText=starttime;}
</script><body>
<h5 id="id2">10</h5>
<button id="id1" onclick="daojishi()">开始倒计时</button></body>
</html>

7.setTimeout()和setInterval()的使用以及区别

1、setTimeout()方法

      这个方法所有浏览器都支持,setTimeout( ) 是属于 window 的 method, 但我们都是略去 window 这顶层物件名称, 这是用来

设定一个时间, 时间到了, 就会执行一个指定的 method。

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><script>var x = 0;function countSecond(){x = x+1;document.haorooms.haoroomsinput.value = x;setTimeout("countSecond()", 1000)}</script>
</head>
<html>
<body><form name="haorooms"><input type="text" name="haoroomsinput" value="0" size=4 >
</form><script>countSecond();
</script></body>
</html>

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 

clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body></body>
<script>function test(){this.name = "setInternal";this.waitMes = function(){var that = this;setInterval(function(){alert(that.name);},3000);}}var te = new test();te.waitMes();
</script>
</html>

通过上面可以看出,setTimeout和setinterval的最主要区别是:

    1)setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束。如果运行的代码中再次运行同样

的setTimeout命令,则可循环运行。(即 要循环运行,需函数自身再次调用 setTimeout());而 setinterval是循环运行的,即每

到设定时间间隔就触发指定代码。这是真正的定时器。

    2)setinterval使用简单,而setTimeout则比较灵活,可以随时退出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒。
 

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

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

相关文章

(五)Struts2 标签

所有的学习我们必须先搭建好Struts2的环境&#xff08;1、导入对应的jar包&#xff0c;2、web.xml&#xff0c;3、struts.xml&#xff09; 第一节&#xff1a;Struts2 标签简介 Struts2 自己封装了一套标签&#xff0c;比JSTL 强大&#xff0c;而且与Struts2 中的其他功能无缝结…

HarmonyOS常见问题解答

学习资源主要分享 一、解答学习者的担心:手机/生态设备数量 、应用数量

推荐几十本投资书籍、互联网书籍及热门查看流量的工具

工欲善其事必先利其器,今天孙叫兽给大家分享一下互联网运营的书籍、投资的书籍及一些查看抖音、微信公众号等后台数据的工具,个人感觉还是很实用的,内容有点多,不知道的可以根据图中的文字进行搜索。 互联网运行推荐阅书籍 投资理财的书籍 这里仅仅提供书籍的名称,根据书名…

Java Swing模型视图适配器介体

通常&#xff0c;我基于Spring Framework构建Java应用程序。 但是&#xff0c;最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序&#xff0c;因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续&#xff0c;可以在GitHu…

程序员跳槽指南

找工作是件非常重要的事情,它直接影响你1~2年,间接影响你3~5年的人生。⼀个潜在的机会会让你少奋斗很多年,而一次冲动的离职,会让你和千万财富错失交臂。 忘掉那些随地乱扔的小广告,还有从几十个样本做出来的所谓调查报告,换工作不是⼀场说走就走的旅行,而是⼀个深思熟虑…

netbeans 源文件_具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian

netbeans 源文件您可能已关注我的文章&#xff0c;该文章介绍了如何使用嵌入式GlassFish测试更复杂的场景&#xff08; 第I部分/第II部分 &#xff09;。 在我要做的事情上&#xff0c;下一步是使此设置与最新的WebLogic 12c一起使用。 入门 按照我的前两个帖子的入门部分中的…

程序员外包避坑指南?

为什么我不建议你去外包? 外包的分类 外包公司一般有两类,一类是驻场外包,一类是非驻场外包。二者的区别为是否需要被外派到甲方公司上班。如果需要,那么就属于驻场外包,否则就是非驻场外包。 虽然都是外包,但是两者的区别还是挺大的。 先说说驻场外包。由于需要被外派到…

数据库设计三大范式

数据库设计三大范式 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 在实际开发中最为常见的设…

在各个PC端应用使用表情的快捷键,王大妈都开始用这个表情啦

很多人像在文章或者聊天使用表情&#xff0c;但是不知道如何输入&#xff0c;下面孙叫兽就来带你体验一下吧 快捷键 win. 比如在微信聊天框使用win. 就可以输入表情符号&#xff0c;颜文字及符号。 你们学废了&#xff1f;

扩展Java EE应用程序的基础

老实说&#xff0c;“可扩展性”是一个详尽的主题&#xff0c;并且通常没有被很好地理解。 通常&#xff0c;它被假定与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 集群 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题&#xff0c;但是问题在…

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

目录 第 1 章 介绍... 1 1.1. 什么是Wireshark. 1 1.1.1. 主要应用... 1

小白自学前端,轻松月入过万哦!

第一、 前端的入门操作 首先是要熟悉前端的基础操作。 前端的基础&#xff1a;JavaScript&#xff0c;HTML&#xff0c;CSS&#xff0c;然后可以深入学习jQuery。 如果你是想 1.专攻网页&#xff0c;那你就学习HTML。 2.专攻层叠样式表&#xff0c;就学习CSS&#xff0c;它可以…

netbeans代码提示_Java代码现代化的七个NetBeans提示

netbeans代码提示在“ 七个不可或缺的NetBeans Java提示”一文中 &#xff0c;我谈到了一般使用NetBeans提示的问题&#xff0c;然后重点介绍了七个提示。 接下来列出了该帖子中强调的七个提示&#xff1a; 可疑方法调用 使用或&#xff01; AND字符串构造函数比较字符串 构造…

史上最全SVN使用总结,建议先收藏后观看

最近在公司又开始玩SVN啦&#xff0c;这里给大家总结一下&#xff0c;基本上在公司不是用git就是用SVN进行代码管理&#xff0c;作为程序员&#xff0c;这些工具的使用还是需要熟悉了解一下的&#xff0c;本期孙叫兽给大家分享一下SVN相关的知识点&#xff0c;做到会用即可。不…

JS常用正则表达式

感谢水之原的整理&#xff0c;比较全得正则表达式 整数或者小数&#xff1a;^[0-9]\.{0,1}[0-9]{0,2}$只能输入数字&#xff1a;"^[0-9]*$"。只能输入n位的数字&#xff1a;"^\d{n}$"。只能输入至少n位的数字&#xff1a;"^\d{n,}$"。只能输入m~…

14万字面试题汇总整理,祝你顺利斩获大厂前端offer

导读&#xff1a;最近很多小伙伴私信我说&#xff0c;一般大厂的前端面试题都有哪些&#xff0c;应该如何准备&#xff0c;要不要刷题等等&#xff0c;这里孙叫兽简单给大家总结一下前端的高频面试题&#xff0c;如果对你有帮助&#xff0c;记得点赞评论收藏。现在很多大厂都比…

又见链表 --- 另一种Creat方式与反转

链表 作为一种数据结构&#xff0c;链表以其方便的增删查改功能&#xff0c;实现了无数经典有用的程序。 在之前的帖子里&#xff0c;我构建链表的方式是建立一个不储存数据的head节点&#xff0c;然后通过一边输入数据一边建立结点的方式构建整个链表。 与之前不同的是&#x…

现在抖音这么火,那么你知道如何用CSS实现抖音字体?

比如这种抖音字体是不是感觉很酷,它是如何实现的呢,下面孙叫兽就简单分享一下CSS的实现方法,记得点赞收藏。 老司机给大家的一些小建议,一定要敲代码敲代码敲代码(重要的事情说三遍),程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。 实现这…

史上最全关于苹果开发者账号及上架APPStore总结

很多人如果开发这种移动应用APP,上架到到APPStore难免会遇到一系列的问题,这里孙叫兽进行总结一下,如果本文对你有帮助,记得转发点赞收藏。 一: 开发者账号的介绍 1 个人开发者账号 申请费用: 99美元/年 介绍:一般由iOS开发者个人申请,上架开发者自己的APP作品到苹果商…

EK算法应用,构图(POJ1149)

题目链接&#xff1a;http://poj.org/problem?id1149 题意中有一点要注意&#xff0c;否则构图就会有问题&#xff0c;每个顾客走后&#xff0c;被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中。 这里的构图不是单一的相邻&#xff0c;以及容量了&#xff0c;…