手撕前端面试题(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.闭包


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


目录
相关文章
|
5月前
|
JavaScript 前端开发 API
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
275 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
195 8
|
6月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
5407 24
|
7月前
|
自然语言处理 JavaScript 前端开发
当面试官再问我JS闭包时,我能答出来的都在这里了。
闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
283 16
当面试官再问我JS闭包时,我能答出来的都在这里了。
|
7月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
183 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
10月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
153 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
JavaScript
js 获取并解析 url 中参数的三种方法
js 获取并解析 url 中参数的三种方法
1762 0
|
JavaScript
JS解析url中的参数
JS解析url中的参数
272 0
|
JSON JavaScript 数据格式
JS解析URL参数并返回JSON格式
背景 有时候,简单的参数只需要两个页面间传递,无需后台加工,这个时候,就可以考虑使用页面间传参方式 方案 采用JS中location.search获取传递的参数 优势 1、直接传递2、无依赖3、主流浏览器都支持 优化 1、对获取的原生问号参数进行二次加工,转换成JSON对象,就可以支持点属性了,很方便。
1765 0