手撕前端面试题(Javascript~事件委托、数组去重、合法的URL、快速排序、js中哪些操作会造成内存泄漏......

简介: 手撕前端面试题(Javascript~事件委托、数组去重、合法的URL、快速排序、js中哪些操作会造成内存泄漏......

事件委托

问题 1:

请补全JavaScript代码,要求如下:

1、给"ul"标签添加点击事件

2、 当点击某"li"标签时,该标签内容拼接".“符号。如:某"li"标签被点击时,该标签内容为”…"

注意:必须使用DOM0级标准事件(onclick)


解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
      <ul >
            <li>.</li>
            <li>.</li>
            <li>.</li>
        </ul>
        <script type="text/javascript">
            // 补全代码
            let ul = document.querySelector('ul');
            ul.onclick = function(event) {
                let currentTarget = event.target;
                if(currentTarget.tagName.toLowerCase() === 'li') {
                    currentTarget.innerText += '.'
                }
            }
        </script>
    </body>
</html>

微信图片_20220927113722.png总结:

1、这题主要考点是点击事件、事件捕获、事件冒泡。

2、详细步骤:

1)、给 ul 标签添加点击事件

2)、在点击事件函数中获取到点击事件“event”

3)、判断触发该点击事件的“event”是否为 li 标签

4)、如果是li 标签触发点击事件则修改标签内容,否则 不修改标签内容

数组去重

问题 2:

请补全JavaScript代码,要求去除数组参数中的重复数字项并返回该数组。

注意:数组元素仅包含数字,无需考虑非数字情况


示例1

输入:

_deleteRepeat([-1,1,2,2])

输出:

[-1,1,2]


解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
        <script type="text/javascript">
            const _deleteRepeat = array => {
                // 补全代码
                return Array.from(new Set(array));
            }
        </script>
    </body>
</html>

微信图片_20220927113810.png总结:


1、这里所选择的方法是一个最简单的方法,使用了自带的set方法去重。

2、除了上面一种方法,还有一种很常用的方法。详细步骤:

1)建立一个新的空数组。

2)遍历数组元素,放入前进行indexOf判断在不在新建的数组中。

3)要是在就进行下一个元素判断,要是不在就添加到新的数组当中。

indexOf用法:

使用indexOf方法判断元素是否在数组中。注:如果结果为-1,表示没找到指定的元素

3、 includes() 方法也可以用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。


《《js 中 includes和indexOf的区别》》

区别1:


includes用来判断一个数组是否包含指定的值,包含返回ture,否则为false;

indexOf返回在数组中存在指定值的第一个索引,不存在返回-1

const arr = ['a','b']
console.log(arr.includes('a'))// true
console.log(arr.indexOf('a'))// 0

区别2:

includes可以判断有NaN的元素,indexOf不能

const arr = ['a','b',NaN]
console.log(arr.includes(NaN))// true
console.log(arr.indexOf(NaN))// -1

合法的URL

问题 3:

请补全JavaScript代码,要求以Boolean的形式返回字符串参数是否为合法的URL格式。

注意:协议仅为HTTP(S)

解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
        <script type="text/javascript">
            const _isUrl = url => {
                // 补全代码
                return url.split(':')[0]  == "https" ;
            }
        </script>
    </body>
</html>

微信图片_20220927113936.png总结:

1、使用分隔符split。url.split(‘:’)[0] == “https”; 举个例子吧。

url=https:// www.baidu.com
url.split(':')[0]  = "https"
url.split(':')[1]  = "// www.baidu.com"

快速排序

问题 4:

请补全JavaScript代码,要求将数组参数中的数字从小到大进行排序并返回该数组。

注意:

1、数组元素仅包含数字

2、请优先使用快速排序方法

示例1 输入: _quickSort([0,-1,1,-2,2]) 复制 输出: [-2,-1,0,1,2]


解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
        <script type="text/javascript">
            const _quickSort = array => {
                // 补全代码
                let arr=[];
                let Data1=array[0];
                array.forEach(arrData=>{
                    if(Data1<arrData){
                        arr.push(arrData);
                    }else{
                        arr.unshift(arrData);
                    }
                })
                return arr;
            }
            console.log(_quickSort([0, -1, 1, -2, 2, -3, -9, 9]));
        </script>
    </body>
</html>

微信图片_20220927114033.png总结:

1、一第一个数当作比较对象,确认后面的数放在那里,完成排序。

2、主要是利用了push()方法和unshift()方法。

3、其实更简单的方法是直接使用js里面的sort方法,return array.sort()


push()、shift()与pop()、unshift()的区别

1)、push()是用来在数组末端添加项,shift()在移除数组的第一个项。

2)、pop()在数组末端移除项,unshift()在数组前端添加项。

3)、push(),unshift()在推入多个项时,各个项之间的顺序不变。

4)、push(),unshift()将数组的长度+1并且返回的是数组的长度;pop(),shift()将数组length-1并返回的是移除的项

全排列

问题 5:

请补全JavaScript代码,要求以数组的形式返回字符串参数的所有排列组合。

注意:

1、字符串参数中的字符无重复且仅包含小写字母

2、 返回的排列组合数组不区分顺序

示例1
输入:
_permute('abc')
输出:
['abc','acb','bac','bca','cab','cba']

解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
        <script type="text/javascript">
            const _permute = string => {
                // 补全代码
                if(string.length === 1) {
                      return [string]
                }
                const results = []
                for(let s of string){
                const arr = string.split('').filter(str =>str !== s)
                    _permute(arr.join('')).forEach(item => {
                results.push(s + item)
            })
        }
    return results
            }
        </script>
    </body>
</html>

微信图片_20220927114131.png

总结:

1、除了上面之外还有很多种方法。例如

   const _permute = string => {
    // 补全代码
    const res = [];
    const backtrace = path => {
        if(path.length == string.length){
            res.push(path);
            return;
        }
        for(const item of string) {
            if(path.includes(item)) continue;
            backtrace(path + item);
        }
    };
    backtrace('');
    return res;
}

js中哪些操作会造成内存泄漏?

1.意外的全局变量


由于我们使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收。


2.被遗忘的计时器或回调函数。


当我们设置了setinterval定时器,而忘记取消它,如果循环函数有对外部变量的引用的话,那么这个变量会被一直留在内存中,而无法被回收。


3.脱离DOM的引用


我们获取一个DOM元素的引用,而后面这个元素被删除,由于我们一直保留了对这个元素的引用,所以它也无法被回收。


4.闭包


不合理的使用闭包,从而导致某些变量─直被留在内存当中。


目录
相关文章
|
13天前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
18天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
127 9
|
18天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
34 6
|
18天前
|
JavaScript 前端开发 Java
JavaScript 中内存泄漏的几种常见情况
【10月更文挑战第25天】实际上还有许多其他的情况可能导致内存泄漏。为了避免内存泄漏,我们需要在开发过程中注意及时清理不再需要的资源,合理使用内存,并且定期检查内存使用情况,以确保程序的性能和稳定性
28 2
|
19天前
|
JavaScript 前端开发 索引
JavaScript获取url网址中域名后面的部分
如何截取 url 中网站域名之后的部分,需要用到以下几个方法:
68 3
|
20天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
54 1
|
1月前
|
存储 开发框架 JavaScript
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
53 0
Node.js实现短链接(ShortLink):shortid、epxress让URL更简单
|
1月前
|
缓存 监控 JavaScript
|
1月前
|
存储 缓存 JavaScript
|
1月前
|
JavaScript
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
41 0