Web前端最全2024前端面试之JavaScript手写题(三)(2),电工面试题及答案

学习笔记

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等

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

HTML/CSS

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

HTML5 /CSS3

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

}

},

// 移除事件

removeEvent: function(element, type, handler) {

if (element.removeEventListener) {

element.removeEventListener(type, handler, false);

} else if (element.detachEvent) {

element.detachEvent(“on” + type, handler);

} else {

element[“on” + type] = null;

}

},

// 获取事件目标

getTarget: function(event) {

return event.target || event.srcElement;

},

// 获取 event 对象的引用,取到事件的所有信息,确保随时能使用 event

getEvent: function(event) {

return event || window.event;

},

// 阻止事件(主要是事件冒泡,因为 IE 不支持事件捕获)

stopPropagation: function(event) {

if (event.stopPropagation) {

event.stopPropagation();

} else {

event.cancelBubble = true;

}

},

// 取消事件的默认行为

preventDefault: function(event) {

if (event.preventDefault) {

event.preventDefault();

} else {

event.returnValue = false;

}

}

};

3.使用迭代的方式实现 flatten 函数。


var arr = [1, 2, 3, [4, 5], [6, [7, [8]]]]

/** * 使用递归的方式处理 * wrap 内保

存结果 ret * 返回一个递归函数 **/

function wrap() {

var ret = [];

return function flat(a) {

for (var item of

a) {

if (item.constructor === Array) {

ret.concat(flat(item))

} else {

ret.push(item)

}

}

return ret

}

}

console.log(wrap()(arr));

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; // 如果模板没有模板字符串直接返回

}

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦

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

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

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

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

}

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

}

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦

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

[外链图片转存中…(img-000UmytN-1715849680056)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值