手撕前端面试题【javascript~模板字符串、类继承、参数解析器、生成页码等】

news2024/11/19 7:31:57

在这里插入图片描述

前端的那些基本标签

  • 🍓🍓模板字符串
  • 🍓🍓类继承
  • 🍓🍓参数解析器
  • 🍓🍓生成页码
  • 🍓🍓js中哪些操作会造成内存泄漏?

html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。

css,相当于把骨架修饰起来,相当于人的皮肉。

js(javascripts),动起来,相当于人的血液,大脑等一切能使人动起来的器官或者其他的。

在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,除此之外牛客里面还有招聘(社招和校招)、一些上岸大厂的大佬的面试经验。 牛客是可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到感兴趣的可以去注册试试可以伴随一生的刷题app

刷题页面,功能完善,短时间坚持可看效果。
在这里插入图片描述

查看出现此处,筛选定制,查询指定大厂出现频率
在这里插入图片描述

首页功能强悍,完全免费
在这里插入图片描述

🍓🍓模板字符串

问题 1:
请补全JavaScript代码,实现以下功能:
1、根据已有的person对象的注册时间求出距离当前时间的天数(天数向下取整)。
2、将获得的天数和person数据拼接成字符串,作为h2标签的内容。
注意:使用模板字符串进行字符串拼接,字符串最终内容如:尊贵的牛客网2级用户小丽您好,您已经注册牛客网3天啦~

解答:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h2></h2>

        <script>
            var person = {
                level: '2',
                name: '小丽',
                registTime: '2021-11-01',
            }
            var h2 = document.querySelector('h2');
            // 补全代码
            var time =new Date(person.registTime).getTime();
            var now =new Date().getTime();
            var days = Math.floor((now  - time )/(24*60*60*1000));
            h2.innerHTML = `尊贵的牛客网${person.level}级用户${person.name}您好,您已经注册牛客网${days}天啦~`;
        </script>
    </body>
</html>

在这里插入图片描述

🎂🎂querySelector
根据选择器获取元素。

1、document.querySelector(“选择器”);
2、document.querySelectorAll(“选择器”);

🎂🎂new Date
new Date([params]),参数传递有以下五种方式:

1new Date("month dd,yyyy hh:mm:ss");
2new Date("month dd,yyyy");
3new Date(yyyy,mth,dd,hh,mm,ss); 注意:这种方式下,必须传递整型;
4new Date(yyyy,mth,dd);
5new Date(ms);

注意:ms:是需要创建的时间和 GMT时间1970年1月1日之间相差的毫秒数;当前时间与GMT1970.1.1之间的毫秒数:var mills = new Date().getTime();


🎂🎂getTime
getTime 方法返回一个整数值,这个整数代表了从 1970 年 1 月 1 日开始计算到 Date 对象中的时间之间的毫秒数。

总结:
🥭🥭1、核心步骤:
🍵🍵1)创建日期转换函数,可以通过new Date().getTime()将"2021-11-01"转换成一串数字。
🍵🍵2)创建日期转换函数得到当前时间的一串数字
🍵🍵3)现在事件减去对象创建时间,得到二者时间差

除此之外,还有很多方法,例如 Math 方法 :

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h2></h2>

        <script>
           var person = {
    level: '2',
    name: '小丽',
    registTime: '2021-11-01',
}
var h2 = document.querySelector('h2');
// 补全代码
let day = getDay(new Date(person.registTime), new Date());
h2.innerText = `尊贵的牛客网${person.level}级用户${person.name}您好,您已经注册牛客网${day}天啦~`;

function getDay(startTime, endTime) {
    return Math.floor((endTime.valueOf() - startTime.valueOf()) / 86400 / 1000);
}

        </script>
    </body>
</html>


🍓🍓类继承

问题 2:
请补全JavaScript代码,完成类的继承。要求如下:
1、 "Chinese"类继承于"Human"类
2、“Human"类实现一个函数"getName”,返回该实例的"name"属性
3、“Chinese"类构造函数有两个参数,分别为"name”、“age”
4、“Chinese"类实现一个函数"getAge”,返回该实例的"age"属性。

解答:

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
    	
        <script type="text/javascript">
            class Human {
                constructor(name) {
                    this.name = name
                    this.kingdom = 'animal'
                    this.color = ['yellow', 'white', 'brown', 'black']
                }
                // 补全代码
                getName(){
                    return this.name
                }
                
            }

            // 补全代码
            class Chinese extends Human{
                constructor(name,age) {
                super(name)
                this.age = age
            }
            getAge() {
                return this.age
            }
}
        </script>
    </body>
</html>

在这里插入图片描述

🎂🎂extends
ES6中有关class的继承方式,引入了extends关键字。但其本质仍然是构造函数+原型链的组合式继承。

class Father {
    constructor(name) {
      this.name = name
    }
    // 原型方法
    // 即 Person.prototype.getName = function() { }
    // 下面可以简写为 getName() {...}
    getName = function () {
      console.log('Person:', this.name)
    }
}

class child extends Father {
    constructor(name, age) {
        super(name)
        this.age = age
    }
    getAge = function () {
        console.log('Age:', this.age)
    }
}

const person = new child('Jim','28')
person.getName() // Person: Jim
person.getAge() // Age: 28

🎂🎂constructor
constructor是Object类型的原型属性,它能够返回当前对象的构造器(类型函数)。利用该属性,可以检测复合类型数据的类型,如对象,数组和函数等。

检测对象和数组的类型,过滤对象、数组

 let o = {};
 let a = [];
 if (o.constructor == Object){
    console.log("o是对象")
 }else if (a.constructor == Array){
    console.log("a是数组“)
}

🎂🎂super()
super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数。子类B的构造函数之中的super(),代表调用父类的构造函数。super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B的实例,因此super()在这里相当于A.prototype.constructor.call(this)。作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。子类中存在构造函数,则需要在使用“this”之前首先调用 super()。

总结:

🥭🥭1、核心步骤。
1)在”Human“;类中添加”getName“函数
2)通过extends使”Chinese”类继承于“Human”类
3)在“Chinese”类的构造函数中可以通过super方法使“name”调用超类构造器
4)在“Chinese”类的构造函数中添加“age”属性
5)在“Chinese”类的构造函数中添加“getAge“函数

注意:JS有多种方式实现继承 ,本题主要使用了 ES6 的 extends 关键字 实现继承



🍓🍓参数解析器

问题 3:
请补全JavaScript代码,要求将字符串参数URL中的参数解析并以对象的形式返回。

示例1
输入:
getParams('https://nowcoder.com/online?id=1&salas=1000')
输出:
{id:1, salas: 100}

解答:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>

    <script>
        const _getParams = (url) => {
            // 补全代码
            var obj = {}
            let index = url.indexOf('#')
            url = index === -1 ? url : url.slice(0, index)
            if (url.indexOf('?') !== -1) {
                let i = url.indexOf("?")
                let arr = url.slice(i + 1).split('&')
                arr.forEach(function (item) {
                    item = item.replace(/\=/, '&')
                    let t = item.split('&')
                    obj[t[0]] = t[1] !== undefined ? t[1] : null
                })
                return obj
            } else {
                return obj
            }
        }
    </script>
</body>

</html>

在这里插入图片描述

🎂🎂split
split() 方法用于把一个字符串分割成字符串数组。

stringObject.split(a,b)

a必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
b可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

一个字符串数组。该数组是通过在 a指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 a自身。但是,如果 a是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

注意:
1、如果把空字符串 ("") 用作 a,那么 stringObject 中的每个字符之间都会被分割。
2、String.split() 执行的操作与 Array.join 执行的操作是相反的。

总结:
🥭🥭1、核心步骤。
1)创建空对象,用于存储参数信息
2)获取URL中"?"的位置并截取之后的参数信息
3)获取到参数信息之后通过split拆分为数组
4)数组通过遍历每一项将”=“替换为”&“并且再次通过split拆分
5)最终将键名和键值赋给空对象

除此之外,还有很多方法,例如 正则提取数据把参数从url中拆解出来,构造一个空对象去承接
正则匹配有很多方法,例如:

url.split("?")[1].split("&");
url.match(/(\w+)=(\w+)/gi);

等等… …

let arr = url.split("?")[1].split("&");
let obj = {};
arr.map(item => {
    let [key, value] = item.split("=");
    obj[key] = value;
})
return obj;



🍓🍓生成页码

问题 4:
请补全JavaScript代码,要求根据参数动态生成"li"标签页码并插入"ul"标签下。要求如下:
1、 "allItem"为总数据项个数,"pageItem"为每页的数据项个数
2、"li"标签内容为当前页码数,页码从1开始

示例1
输入:
_createPage(13,2)
输出:
"li"长度为7,"li"内容依次为"1","2","3","4","5","6","7"

解答:

<!DOCTYPE html>
<html>
<head>
    <meta charset=utf-8>
</head>
<body>
    <ul id="ul">
    </ul>
    <script type="text/javascript">
        const _createPage = (allItem, pageItem) => {
            // 补全代码
            let ul = document.querySelector('#ul')
            let pageNumber = Math.ceil(allItem / pageItem)
            for (let i = 1; i <= pageNumber; i++) {
                let li = document.createElement('li')
                li.innerText = i
                ul.appendChild(li)
            }
        }
    </script>
</body>
</html>

在这里插入图片描述

🎂🎂querySelector
根据选择器获取元素。

1、document.querySelector(“选择器”);
2、document.querySelectorAll(“选择器”);

🎂🎂math
math是JavaScript的一个内置对象,它提供了一些数学属性和方法,可以对数字进行计算(用于Number类型)。 math和其他全局对象不同,它不是一个构造器,math的所有方法和属性都是静态的,直接使用并传入对应的参数。
Math.abs()函数,返回一个数的绝对值
Math.ceil()函数,返回大于或等于一个给定数的最小整数。
Math.cos()函数,返回一个值的余弦值。
Math.floor()方法,返回小于或等于一个给定数字的最大整数 等等… …


🎂🎂appendChild
appendChild() 方法可向节点的子节点末尾添加新的子节点。也可以使用此方法从一个元素向另一个元素移动元素 。

总结:
🥭🥭1、核心步骤。
1)获取”ul“标签
2)计算出总页数,需要向上取整
3)进入循环,创建”li“节点且”li“.innerText为该循环当前轮次
4)在循环内将”li“节点插入”ul“。





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

🥭🥭1.意外的全局变量

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

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

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

🥭🥭3.脱离DOM的引用

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

🥭🥭4.闭包

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



看着是不是感觉手有点痒痒的了。那就来注册下自己试试吧,试试才知道好不好,试试才知道适不适合自己。就算最后没用这款软件那也尝试过,不后悔。
可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到感兴趣的可以去注册试试可以伴随程序员一生的app







觉得有用的可以给个三连,关注一波!!!带你玩转前端

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

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

相关文章

react router6.x官方DEMO

Tutorial v6.4.2 | React Router 初始化项目 import React from "react"; import ReactDOM from "react-dom/client"; import {createBrowserRouter,RouterProvider,Route, } from "react-router-dom"; import "./index.css";const …

用CSS设置颜色、背景和图像效果

&#x1f4dc;个人简介 ⭐️个人主页&#xff1a;微风洋洋&#x1f64b;‍♂️ &#x1f351;博客领域&#xff1a;编程基础&#x1f4a1;,后端&#x1f4a1;,大数据,信息安全 &#x1f345;写作风格&#xff1a;干货,干货,还是tmd的干货 &#x1f338;精选专栏&#xff1a;【J…

js数组常用方法(19种)|你会的到底有多少呢?

一、改变原数组的方法 1.push&#xff08;&#xff09; 末尾添加数据 语法: 数组名.push(数据) 作用: 就是往数组末尾添加数据 返回值: 就是这个数组的长度 //push var arr [10, 20, 30, 40] res arr.push(20) console.log(arr);//[10,20,30,40,20] console.log(res);//52. …

【Cesium】使用TLE轨道两行数计算轨道信息,并生成CZML格式文件

TLE为轨道两行数&#xff0c;简单的说是用两行数字表示轨道的相关信息&#xff0c;本文即用轨道两行数来计算任一时刻卫星的位置信息和速度信息&#xff0c;并生成CZML文件能够读取的格式 1、satellite.js库简介 简而言之&#xff0c;satellite.js库可以根据TLE轨道两行数&…

vue 项目适配笔记本1920*1080 125%缩放

前言 在台式机上开发pc端项目时&#xff0c;由于是1920*1080的分辨路和100缩放&#xff0c;看起来是没有问题。在笔记本上有问题 因为现在很多14寸的笔记本&#xff0c;出厂默认就是125%或150%的显示。导致很多时候我们的项目&#xff0c;自己开发的时候都是按照100%比例来开发…

Vue使用Serial连接串口

本来只是随手记录一下&#xff0c;发现看的人多了&#xff0c;想着还是修复一下bug吧&#xff0c;供各位看官指正 2022-10-24本次更新: 1、修复在不支持Serial的情况下&#xff0c;控制台报错 2022-09-19本次更新: 1、修复了传输数据接收分隔的情况(增加数据缓存) 2、修复串口连…

【中兴】web训练营~一文带你走进前端 | 百图制作

&#x1f4e2;作者简介&#xff1a;物联网领域创作者&#xff0c;&#x1f3c5;阿里云专家博主&#x1f3c5; &#x1f3c5;华为云享专家&#x1f3c5; ✒️个人主页&#xff1a;Choice~ &#x1f310;格言&#xff1a;可正因为难&#xff0c;才有价值&#xff01;&#x1f536…

Linux 使用Nginx部署web(vue、react)项目

前言 本文基于&#xff1a;操作系统 CentOS 7.6 使用的工具&#xff1a;Xshell7、Xftp7 1.安装所需依赖 安装gcc yum -y install gcc安装pcre、pcre-devel yum -y install pcre pcre-devel安装zlib、zlib-devel yum install -y zlib zlib-devel安装openssl、openssl-dev…

【uni-app】点击左上角返回按钮,弹出弹窗或者是携带参数返回上一页

目录 1、弹出弹窗 2、把这一页的数据带回到上一页&#xff08;获取下一页的数据 &#xff09; 3、跳转页面并携带参数&#xff0c;接受页获取参数 1、弹出弹窗 当我返回上一页的时候需要做一个判断是否需要保存 onBackPress 只支持APP和H5 但不支持小程序 &#xff0c;可以…

Java web—访问http://localhost:8080/xx/xx.jsp报404错误问题

由于我们在eclipse ee中把项目部署在web端经常会出现报404错误。 原因为&#xff1a; 404状态码是一种http状态码&#xff0c;其意思是&#xff1a; 所请求的页面不存在或已被删除。通俗的讲就是当用户输入了错误的链接时&#xff0c;返回的页面。 以下描述几种情况&#xff1a…

IDEA从零到精通(24)之lombok插件的安装与使用

文章目录作者简介引言导航概述安装插件使用小结导航热门专栏推荐作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性…

【Vue】 组件封装

目录1 组件封装1.1 全局注册1.2 局部注册1.2.1 命名1.2.2 引用组件1.2.2.1 传统写法1.2.2.2 setup1.2.2.3 easycom1.3 父子组件间的数据传递1.3.1 子组件 data() 中设置数据1.3.2 父组件通过 prop 将数据传递给子组件1.3.3 子组件不能直接修改 prop 中的值1.3.4 子组件通过 emi…

Pinia中action使用详解

actions的使用 动作相当于组件中的方法。它们可以使用actionsin 属性进行定义。 并且在pinia中的action既可以有同步函数也可以有异步函数。 在actions中可以通过this访问该仓库所有实例 export const useUsers defineStore(users,{state:()>{userData:null},actions:{a…

【SpringMVC】集成Web、MVC执行流程、数据响应、数据交互

文章目录前言一.Spring集成Web二.对于SpringMVC的理解三.MVC执行流程&#xff08;&#x1f3f3;️‍&#x1f308;&#xff09;1.组件解析2.RequestMapping四.SpringMVC数据响应页面跳转回写数据五.SpringMVC获得请求数据前言 SpringMVC确实很麻烦&#xff0c;零碎的点太多 一…

小程序自定义tabbar导航栏、动态控制tabbar功能实现(uniapp)

uniapp开发小程序&#xff0c;不同角色/已登录未登录&#xff0c;都有不一样的底部导航栏&#xff0c;这些情况下就需要自行定义tabbar&#xff0c;从而实现动态tabbar的实现。 1.首先我们需要在pages.json配置tabbar 我这里并没有开启custom(自定义)&#xff0c;不开启的话&a…

vue实现思维导图

介绍 前景&#xff1a; 仿幕布实现思维导图效果 技术实现&#xff1a;jsmind 完整代码&#xff1a;vue-jsmind 参考文章&#xff1a; 在vue中使用jsmind组织架构或思维导图 实现效果&#xff1a; 功能描述&#xff1a; 编辑、删除、插入、拖拽、展开/收起节点分布结构切换…

数字IC前端面试问题总结

本篇主要参考了 1、新芯设计(3条消息) 新芯设计的博客_CSDN博客-如何成为一名高级数字 IC 设计工程师,数字 IC 技能拓展,基于 SoC 的卷积神经网络车牌识别系统设计领域博主 2、小汪的IC自习室 (3条消息) 小汪的IC自习室的博客_CSDN博客-数字IC设计,SystemVerilog & I…

前端使用xlsx插件读取excel文件数据(保姆级教程)

本人属于一个实习菜鸟&#xff0c;大神请谨慎阅读............ 在开发过程中&#xff0c;难免会碰到用前端来处理excel文件的需求&#xff0c;我们需要解析出excel文件的内容然后在以对象的形式展示或者与后端对接 功能的实现思路&#xff1a; 文件选择 > FileReader对象…

微信小程序中使用vant框架,方法步骤清晰,简单适用

1.说到vant框架相信大家应该并不陌生了吧&#xff0c;做过移动端开发的小伙伴们应该都知道它吧。 2.Vant 是有赞前端团队开源的移动端组件库&#xff0c;于 2017 年开源&#xff0c;已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务&#xff0c;对外服务十多万开发者&am…

Vue 权限菜单(动态路由)详解

今天记录一下Vue的权限菜单&#xff08;动态路由&#xff09;&#xff0c;在我们写后台的时候用的比较多&#xff0c;Vue的权限菜单分两种&#xff0c;一种是通过本地进行&#xff0c;根据账号的权限进行筛选出可用的权限&#xff0c;组合菜单并在页面上渲染显示&#xff0c;另…