6-2020-百度-前端

1.自我介绍。有遇到过什么苦难吗

2.学习前端,有看哪些书,有什么收获?

3.为什么有箭头函数?和之前的区别是什么。

在箭头函数出现之前,每个新定义的函数都有其自己的 this 值。箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,因此下面的代码将如期运行。

普通函数的this指向调用它的那个对象。箭头函数的 this 永远指向其上下文的  this ,任何方法都改变不了其指向,如 call() ,  bind() ,  apply()

4.call,apply,bind的区别

共同点:
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文(函数的每次调用都会拥有一个特殊值——本次调用的上下文(context)——这就是this关键字的值。);
apply 、 call 、bind 三者都可以利用后续参数传参;

不同点:

call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表。当第一个参数为null、undefined的时候,默认指向window。

apply接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组。当第一个参数为null、undefined的时候,默认指向window。
bind 和call很相似,第一个参数是this的指向,从第二个参数开始是接收的参数列表。区别在于bind方法返回值是函数以及bind接收的参数列表的使用。

事实上apply 和 call 的用法几乎相同, 唯一的差别在于:当函数需要传递多个变量时, apply 可以接受一个数组作为参数输入, call 则是接受一系列的单独变量。

bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 

5.讲一下事件循环,微任务,宏任务。

6.讲一下内存回收。存储机制。标记引用。

内存泄漏:

浏览器封装的V8引擎支持对JS进行解析,当程序运行(runtime)时,只要程序提出需要内存,例如声明赋值字符串、对象、数组等变量时;操作系统就必须给分配内存使用,对于持续运行的服务进程,变量不断增加,并且内存没有得到及时的释放,内存占有会越来越大,轻则影响系统性能,重则直接导致系统崩溃。 不再用到的内存,没有及时释放,就叫做内存泄漏

有些语言(比如c语言)必须手动释放内存,程序员负责内存管理。这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为垃圾回收机制

垃圾回收机制:

解决内存的泄露,垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。有两种方法:标记清除、引用计数。

标记清除:

目前主流IE,Firefox,Opera,Chrome和Safari等浏览器均使用标记清除的垃圾收集策略。js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在一个函数中声明一个变量,就将这个变量标记为"进入环境",从逻辑上讲,永远不能释放进入环境变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为"离开环境"。

引用计数:

语言引擎有一张"引用表",保存了内存里面所有资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1,如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值的引用的变量又取得了另外一个值,则这个值的引用次数减1,当这个值的引用次数为0时,则说明没有办法再访问这个值了,因此就可以将其占用的内存空间回收回来。

7.url从输入到渲染的过程。

8.缓存有哪几种。

9.讲一下渲染的过程。

结构——样式——整合

  • 根据HTML结构生成DOM Tree
  • 根据CSS生成CSSOM
  • 根据DOM和CSSOM整合形成RenderTree
  • layout:根据RenderTree开始渲染和展示
  • 遇到<script>时,会执行并阻塞渲染,因为js有权利改变DOM结构,避免冲突从上到下执行

10.算法题:实现一个模版字符串的方法

const temp = 'World';
const name = 'John';
const str = 'Hello ${temp}! ${name}';
function foo (template){
  return template.replace((/\$\{([^}]+)\}/g),function(match,key){
  return eval(key)
  });
}
console.log(foo(str));//Hello World! John

 最重要的就是正则表达式:/\$\{([^}]+)\}/g

/ /g  表示正则表达式的开始与结束,全局匹配;

\$\{    \}  匹配字符串; 

([^}]+)  选择:用()来标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。用圆括号 () 将所有选择项括起来,表示捕获分组。为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串。 或(\w+)

[^}]+    限定符:匹配前面的子表达式一次或多次 

[^}]    定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*] 表示空格或者*号

^}       定位符^:匹配输入字符串的开始位置。但是当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。

我自己测试通过的还有:/\$\{(\w+)\}/g      /\$\{([^.$]+)\}/g

11.算法题:数组排序

12.讲一下数组去重的方法。

13.了解前端工程化吗?了解打包吗? 

二面:

1.介绍项目

2.怎么做表单?工具化的方式?检验输入的表单验证?

3.写promose.all原理

4.了解llm,vue,react吗?和angular的区别是什么?

5.es6了解吗?解构赋值?模块化?

6.了解es7的装饰器吗

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值