2024前端面试之JavaScript手写题(三),小程序开发教程

4.怎么实现一个sleep


sleep函数作用是让线程休眠,等到指定时间在重新唤起。

function sleep(delay) {

var start = (new Date()).getTime();

while ((new Date()).getTime() - start < delay) {

continue;

}

}

function test() {

console.log(‘111’);

sleep(2000);

console.log(‘222’);

}

test()

5.实现正则切分千分位(10000 => 10,000)


//无小数点

let num1 = ‘1321434322222’

num1.replace(/(\d)(?=(\d{3})+$)/g,‘$1,’)

//有小数点

let num2 = ‘342243242322.3432423’

num2.replace(/(\d)(?=(\d{3})+.)/g,‘$1,’)

复制代码

27.对象数组去重

输入:

[{a:1,b:2,c:3},{b:2,c:3,a:1},{d:2,c:2}]

输出:

[{a:1,b:2,c:3},{d:2,c:2}]

首先写一个函数把对象中的key排序,然后再转成字符串

遍历数组利用Set将转为字符串后的对象去重

function objSort(obj){

let newObj = {}

//遍历对象,并将key进行排序

Object.keys(obj).sort().map(key => {

newObj[key] = obj[key]

})

//将排序好的数组转成字符串

return JSON.stringify(newObj)

}

function unique(arr){

let set = new Set();

for(let i=0;i<arr.length;i++){

let str = objSort(arr[i])

set.add(str)

}

//将数组中的字符串转回对象

arr = […set].map(item => {

return JSON.parse(item)

})

return arr

}

6.解析 URL Params 为对象


let url = ‘http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled’;

parseParam(url)

/* 结果

{ user: ‘anonymous’,

id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型

city: ‘北京’, // 中文需解码

enabled: true, // 未指定值得 key 约定为 true

}

*/

function parseParam(url) {

const paramsStr = /.+?(.+)$/.exec(url)[1]; // 将 ? 后面的字符串取出来

const paramsArr = paramsStr.split(‘&’); // 将字符串以 & 分割后存到数组中

let paramsObj = {};

// 将 params 存到对象中

paramsArr.forEach(param => {

if (/=/.test(param)) { // 处理有 value 的参数

let [key, val] = param.split(‘=’); // 分割 key 和 value

val = decodeURIComponent(val); // 解码

val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字

if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加一个值

paramsObj[key] = [].concat(paramsObj[key], val);

} else { // 如果对象没有这个 key,创建 key 并设置值

paramsObj[key] = val;

}

} else { // 处理没有 value 的参数

paramsObj[param] = true;

}

})

return paramsObj;

}

7.模板引擎实现


let template = ‘我是{{name}},年龄{{age}},性别{{sex}}’;

let data = {

name: ‘姓名’,

age: 18

}

render(template, data); // 我是姓名,年龄18,性别undefined

复制代码

function render(template, data) {

const reg = /{{(\w+)}}/; // 模板字符串正则

if (reg.test(template)) { // 判断模板里是否有模板字符串

const name = reg.exec(template)[1]; // 查找当前模板里第一个模板字符串的字段

template = template.replace(reg, data[name]); // 将第一个模板字符串渲染

return render(template, data); // 递归的渲染并返回渲染后的结构

}

return template; // 如果模板没有模板字符串直接返回

}

8.转化为驼峰命名


var s1 = “get-element-by-id”

// 转化为 getElementById

复制代码

var f = function(s) {

return s.replace(/-\w/g, function(x) {

return x.slice(1).toUpperCase();

})

}

9.查找字符串中出现最多的字符和个数


例: abbcccddddd -> 字符最多的是d,出现了5次

let str = “abcabcabcbbccccc”;

let num = 0;

let char = ‘’;

// 使其按照一定的次序排列

str = str.split(‘’).sort().join(‘’);

// “aaabbbbbcccccccc”

// 定义正则表达式

let re = /(\w)\1+/g;

str.replace(re,($0,$1) => {

if(num < $0.length){

num = $0.length;

char = $1;

}

});

console.log(字符最多的是${char},出现了${num}次);

10.图片懒加载


let imgList = […document.querySelectorAll(‘img’)]

let length = imgList.length

const imgLazyLoad = function() {

let count = 0

return (function() {

let deleteIndexList = []

imgList.forEach((img, index) => {

let rect = img.getBoundingClientRect()

if (rect.top < window.innerHeight) {

img.src = img.dataset.src

deleteIndexList.push(index)

count++

if (count === length) {

document.removeEventListener(‘scroll’, imgLazyLoad)

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

Vue 编码基础

2.1.1. 组件规范

2.1.2. 模板中使用简单的表达式

2.1.3 指令都使用缩写形式

2.1.4 标签顺序保持一致

2.1.5 必须为 v-for 设置键值 key

2.1.6 v-show 与 v-if 选择

2.1.7 script 标签内部结构顺序

2.1.8 Vue Router 规范

Vue 项目目录规范

2.2.1 基础

2.2.2 使用 Vue-cli 脚手架

2.2.3 目录说明

2.2.4注释说明

2.2.5 其他

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

ina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】]( )**

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值