面试题(更新中),github面经

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

}else{

obj[key]=1

}

}

console.log(obj)

var max = 0;

var charmax;

//遍历数组,找出出现最多的字母出现的次数

for (var key in obj) {

if (obj[key] > max) {

max = obj[key];

charmax = key;

}

}

console.log(“出现最多的字符是” + charmax + “,出现了” + max + “次”);

Javascript中 callee和 caller 的作用?


callee是函数arguments对象内的指针,它指向当前的函数,使得在函数内部递归调用当前函数时,不需要调用函数名称,减少函数内部对于函数名的依赖

caller是函数的一个属性,它指向调用当前函数的函数,如果当前函数在其他函数内被调用,则返回调用它的那个函数,如果是在全局环境下被调用,则返回 null

我们可以利用caller的特性跟踪函数的调用链

http常见的状态码有那些?分别代表是什么意思?


1xx : Hold on (等着)

2xx : Here you go (执行完了,没毛病,拿着结果回去吧)

3xx : Go away (你要的不在我这儿,去别处找)

4xx : You fucked up (你丫出问题了)

5xx : I fucked up (我特么出问题了)

200 OK 服务器成功处理了请求(这个是我们见到最多的)

304 Not Modified:服务端的资源与客户端上一次请求的一致,不需要重新传输,客户端使用本地缓存的即可

400 Bad Request:用于告诉客户端它发送了一个错误的请求

404 Not Found (页面丢失) 未找到资源

500 Internal Server Error:服务器内部出现了错误

501 Internal Server Error 服务器遇到一个错误,使其无法对请求提供服务

JavaScript为什么要进行变量提升,它导致了什么问题?


解析和预编译过程中的声明提升可以提高性能,让函数可以在执行时预先为变量分配栈空间

(2)容错性更好

使一些不规范的代码也可以正常执行

var 定义函数的问题

for (var i = 1; i <= 5; i++) {

setTimeout(function timer() {

console.log(i)

}, i * 1000)

}

首先因为 setTimeout 是个异步函数,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。解决办法有三种:

  • 第一种是使用闭包的方式

for (var i = 1; i <= 5; i++) {

(function(j) {

setTimeout(function timer() {

console.log(j)

}, j * 1000)

})(i)

}

在上述代码中,首先使用了立即执行函数将 i 传入函数内部,这个时候值就被固定在了参数 j 上面不会改变,当下次执行 timer 这个闭包的时候,就可以使用外部函数的变量 j,从而达到目的。

  • 第三种就是使用 let 定义 i 了来解决问题了,这个也是最为推荐的方式

for (let i = 1; i <= 5; i++) {

setTimeout(function timer() {

console.log(i)

}, i * 1000)

}

在 Javascript 中什么是伪数组?如何将伪数组转化为标准数组?


arguments是一个对象,它的属性是从 0 开始依次递增的数字,还有calleelength等属性,与数组相似;但是它却没有数组常见的方法属性,如forEach, reduce等,所以叫它们类数组。

伪数组(NodeList),又称类数组,指无法直接调用数组的方法,可以使用对标准数组遍历的方法来遍历它们,比如for循环。函数arguments参数,还有像调用getElementByTagName()之类的方法,它们都返回伪数组。

伪数组的特征:

1. 具有`length`属性

2. 按索引方式存储数据

3. 不具有数组的方法

伪数组转换为标准数组:

1、 function nodeList() {

return Array.prototype.slice.call(arguments);

}

let arr = nodeList(1, 2, 3, 4, 5, 6, 7);

通过`Array`数组构造函数调用原型对象中的`slice()`方法,并通过`call()`方法改变其`slice()`方法的内部this指向,修改为`arguments`,即伪数组对象。 7通过这样的方法,我们就可以返回一个数组对象,这样就将伪数组转换为标准数组了

2、Array.from(arguments);

from()方法用于通过拥有length属性的对象或可迭代的对象来返回一个数组。

3、通过 apply 调用数组的 concat 方法来实现转换

Array.prototype.concat.apply([], arrayLike);

4、const arrArgs = […arguments]

想实现一个对页面某个节点的拖曳?如何做?


1. 给需要拖拽的节点绑定 mousedown, mousemove, mouseup 事件

2. mousedown 事件触发后,开始拖拽

3. mousemove 时,需要通过 event.clientX 和drag.offsetLeft 获取拖拽位置,并实时更新位置

4. mouseup 时,拖拽结束

5. 需要注意浏览器边界的情况

简述link和 import 的区别?


区别 1:link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事务;@import 属于 CSS 范畴,只能加载 CSS。

区别 2:link 引用 CSS 时,在页面载入时同时加载;@import 需要页面网页完全载入以后加载。

区别 3:link 是 XHTML 标签,无兼容问题;@import 是在 CSS2.1 提出的,低版本的浏览器不支持。

区别 4:link 支持使用Javascript 控制 DOM 去改变样式;而@import 不支持。

写 Vue 项目时为什么要在列表组件中写 key,其作用是什么?


验证为什么需要key案例 (独一无二的key属性)


  • 第一种情况是 v-if 中使用 key。使用 key 的元素不会被复用。

  • 第二种情况是 v-for 中使用 key。高效的实现复用。diff 操作可以更准确、更快速

不建议用index作为key?

使用index 作为 key和没写基本上没区别,因为不管数组的顺序怎么颠倒,index 都是 0, 1, 2…这样排列

不推荐在同一元素上使用v-if和v-for,当他们处于同一节点,v-for的优先级比v-if高,即v-if将分别重复运行于每个v-for循环中;

有相同父元素的子元素必有独特的key,重复的key会造成渲染错误;

diff算法

image.png

var,let和const之间的区别


块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:

内层变量可能覆盖外层变量

用来计数的循环变量泄露为全局变量

变量提升:var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否则会报错。

重复声明:var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的变量。const和let不允许重复声明变量。

暂时性死区:在代码块内,使用let命令声明变量之前,该变量不可用。这在语法上,称为暂时性死区。

初始值设置:在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。

指针指向:let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向(可以重新赋值)。但const声明的变量是不允许改变指针的指向。

const对象的属性可以修改吗

const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动。

对于基本类型的数据(数值、字符串、布尔值),其值就保存在变量指向的那个内存地址,因此等同于常量。

但对于引用类型的数据(主要是对象和数组)来说,变量指向数据的内存地址,保存的只是一个指针,const只能保证这个指针是固定不变的。

箭头函数和普通函数的区别:


a. 箭头函数和普通函数的样式不同,箭头函数语法更加简洁、清晰,箭头函数是=>定义函数,普通函数是function定义函数。

b. 箭头函数定义的时候this值就确定了,永久不变。

c. 箭头函数不能作为构造函数使用,也不能使用new关键字

d. 箭头函数没有自己的arguments。

e. call、apply、bind 并不会影响其 this 的指向。

f. 箭头函数没有原型prototype。

面向对象和面向过程的区别


面向对象=》 组件(方法1,方法2,方法3)

面向过程=》 顺序

this指向


谁调用指向谁

方式不同指向不同

function Person(name){

this.name=name //Person

console.log(this)

}

let p=new Person();

let obj={

print:Person

}

Person() //window

obj.print() //object

setInterval(Person,5000) //window

Person.call(document) //document

call,apply,bind

let 新函数 = 函数.bind(obj) 新函数的this永远指向obj

实现bind:


function Person(name){

this.name=name

console.log(this)

}

Function.prototype.mybind=function(target){

var _this=this;

return function(){

_this.apply(target,arguments);

}

}

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料

前端路线图

vue.js的36个技巧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
urn function(){

_this.apply(target,arguments);

}

}

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料

[外链图片转存中…(img-FQGJJCch-1713107348259)]

[外链图片转存中…(img-LAatRwiz-1713107348259)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-GBww6ixg-1713107348259)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值