【JavaScript】巩固JS开发中十个常用功能/案例(11-20)

简介: 【JavaScript】巩固JS开发中十个常用功能/案例(11-20)

前言

博主发现了一个超级好用的刷题、面试、求职的网站:牛客网,它不仅具有公司真题专项练习面试题库在线编程等功能,还具有非常强大的AI模拟面试功能,简直是求职者的福音!

牛客网里的题库还是比较全面的,无论你是前端还是后端,都能在牛客网上找到适合自己的题,赶快点击链接去注册登录吧:点我进入牛客网

本篇文章所有示例来自于牛客网题库/在线编程/JS篇(11-20题),这些都是前端开发中常用的功能,借此记录一下刷题过程,巩固基础

一、列表动态渲染

列表的动态渲染是前端开发中最常见的效果,这个案例中我们需要将people数组渲染在页面中,实现下面的列表:

  • 牛油1号 20岁
  • 牛油2号 21岁
  • 牛油3号 19岁
<body>
    <ul></ul>

    <script>
        var people = [
            { name: '牛油1号', id: 1, age: 20 },
            { name: '牛油2号', id: 2, age: 21 },
            { name: '牛油3号', id: 3, age: 19 },
        ]
        var ul = document.querySelector('ul');
        // 补全代码
        var str=''
        people.forEach((item)=>{
           str+=`<li>${item.name} ${item.age}岁</li>`
        })
        ul.innerHTML=str
    </script>
</body>

二、计算距离当前日期天数

案例要求:

  1. 根据已有的person对象的注册时间求出距离当前时间的天数(天数向下取整)
  2. 将获得的天数和person数据拼接成字符串,作为h2标签的内容

注意:使用模板字符串进行字符串拼接,字符串最终内容如:尊贵的牛客网2级用户小丽您好,您已经注册牛客网3天啦~

<h2></h2>

<script>
    var person = {
        level: '2',
        name: '小丽',
        registTime: '2021-11-01',
    }
    var h2 = document.querySelector('h2');
    // 补全代码
    // 当前时间戳
    let now =  new Date().getTime()
    // 过去时间措
    let past = new Date(person.registTime).getTime()
    // 相距天数
    let days = Math.floor( (now - past)/(24 * 60 * 60 * 1000))
    h2.innerText = `尊敬的牛客网${person.level}级用户${person.name}您好,你已经注册牛客网${days}天啦~`
</script>

解题步骤:

  • 获取当前时间对应的时间戳
  • 获取person.registTime对应的时间戳
  • 根据两个时间戳的差值计算出两个时间之间的天数
  • 使用模板字符串拼接数据

三、构造函数的继承

ES6class类诞生之前,我们是以函数的形式来书写构造函数,继承在构造函数的运用过程中扮演着非常重要的角色,看下面这个案例:

  1. Human构造函数的原型对象添加getName方法,返回当前实例name属性
  2. Chinese构造函数继承于Human构造函数
  3. Chinese构造函数的原型对象添加getAge方法,返回当前实例age属性
function Human(name) {
   this.name = name
   this.kingdom = 'animal'
   this.color = ['yellow', 'white', 'brown', 'black']
}

function Chinese(name,age) {
   Human.call(this,name)
   this.age = age
   this.color = 'yellow'
}

// 补全代码
// 给"Human"构造函数的原型对象添加"getName"方法
Human.prototype.getName=function(){
    return this.name
}

// 将"Chinese"构造函数继承于"Human"构造函数
Chinese.prototype=new Human()
Chinese.prototype.constructor=Chinese

// 给"Chinese"构造函数的原型对象添加"getAge"方法
Chinese.prototype.getAge=function(){
   return this.age
}

可以看到,普通的构造函数的继承我们主要是通过操作prototype原型对象来进行实现的,这显然是比较麻烦又不太安全的,所以在ES6之后就诞生了class类来替换这种写法

四、类的继承

ES6新增了class类,其能够很好的替代上述构造函数的使用,class实际就是构造函数的语法糖,它的继承写法如下:

  1. Chinese类继承于Human
  2. Human类实现一个函数getName,返回该实例的name属性
  3. Chinese类构造函数有两个参数,分别为nameage
  4. Chinese类实现一个函数getAge,返回该实例的age属性
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;
    }
}

class类是通过extends关键字来继承基类的,同时使用super来调用基类(Human)的构造器(constructor

五、解析URL参数

解析URL参数在前端开发中也是非常常见的功能,看下面这个例子:

输入: getParams('https://nowcoder.com/online?id=1&salas=1000')
输出: {id:1, salas: 100}
const _getParams = (url) => {
    // 补全代码
    const params=url.split('?')[1].split('&')
    const obj={}
    params.forEach(item=>{
        obj[item.split('=')[0]]=item.split('=')[1]
    })
    return obj
}

这主要就是使用了分割字符串的方法split

六、生成页码

在前后端交互过程中,分页功能非常常见,这个案例就是实现前端显示页码的效果:

  1. allItem为总数据项个数,pageItem为每页的数据项个数
  2. li标签内容为当前页码数,页码从1开始

具体要求实际就是需要在ul内通过li显示所有的页码,而_createPage 就是进行这一操作的函数

<body>
    <ul id="ul"></ul>
    <script type="text/javascript">
        const _createPage = (allItem, pageItem) => {
           // 补全代码
           // ceil 向上取整
           var liNum= Math.ceil(allItem/pageItem)
           var nums=''
           for(var i=1;i<=liNum;i++){
             nums+=`<li>${i}</li>`
           }
           ul.innerHTML=nums
        }
    </script>
</body>

这里注意一下,我们使用 ul.innerHTML时并没有事先通过document.getElementById获取ul,那我们为什么能直接操作这个ul呢?

原因在于:目前不使用getElementById方法,也可以用id直接操作对应id的元素,这也适用于一些元素的name属性:

<img name="myDiv" alt="Ailjx"></img>
<img name="myDiv" alt="Ailjx2"></img>
<script>
    console.log(myDiv[0].alt); // Ailjx
</script>

但目前这种写法好像还没形成标准,所以保险起见尽量还是不要使用!

七、数据排序/总成绩排名

这个案例是需要将数组参数中的对象以总成绩(包括属性chinesemathenglish)从高到低进行排序并返回:

const _rank = array => {
    // 补全代码
    return array.sort((prevItem,nextItem)=>{
        const prev = prevItem.chinese+prevItem.math+prevItem.english
        const next = nextItem.chinese+nextItem.math+nextItem.english
        return next - prev
    })
}

对于数组排序,一个sort方法就可搞定!

八、计算子字符串频次

_searchStrIndexOf 函数接受两个参数分别为字符串str、子字符串target,要求返回子字符串target在字符串str中出现的频次:

const _searchStrIndexOf = (str, target) => {
   // 补全代码
   return str.split(target).length-1
}

这个例子,巧妙的使用分割字符串的方法split将字符串在子子字符串处进行分割,形成数组,最后根据数组长度-1即可得到子字符串在字符串中出现的频次

九、判断斐波那契数列

要求以Boolean的形式返回参数数组是否为斐波那契数列:

在数学上,斐波那契数列以如下方法定义: F(0)=0F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N)
注意: [0,1,1]为最短有效斐波那契数列
const _isFibonacci = array => {
    // 补全代码
    if(array.length<3) return false
    
    for(let i=0;i<array.length;i++){
        if(i<2) {
            return array[i]===i
        } else {
            return array[i]===array[i-1]+array[i-2]
        }
    }
}

十、数组扁平化处理

将数组参数中的多维数组扩展为一维数组并返回该数组:

输入: [1,[2,[3,[4]]]]
输出: [1,2,3,4]
const _flatten = arr => {
    // 补全代码
    const newArr=[]
    function each(arr){
        arr.forEach(item=>{
            if(!Array.isArray(item)){
                newArr.push(item)
            }else {
                each(item)
            }
        })
    }
    each(arr)
    return newArr
}

结语

这篇文章内容非常简单,主要是为了巩固自己的基础,正可谓基础不牢,地动山摇!!!

这篇文章的内容都出自于牛客网的JS篇题库,由此可见牛客网的JS题库还是非常贴合实际的,在写的过程中自己查漏补缺,收获了很多。

身为前端,之前的我非常迷茫,不知道怎么刷题,后端常刷的算法题又不太适合我,直到发现牛客网,才结束这一现状!牛客网里的题真的是对前端太友好了,强烈将牛客网推荐给大家!

相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
8天前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
2天前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
1月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
24天前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
39 13
|
1月前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
27天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
1月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
26天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
1月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。