备战面试每日一题

1.如何理解this?

this表示的是函数运行时自动生成的一个内部对象,只能在函数内部使用,总是指向调用它的对象。

this是在运行时进行绑定的,并不是在编写的时候绑定,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。

2.浏览器的多进程和javaScript的单线程

一个进程是由一个或者多个线程组成的,线程是一个进程中代码的不同执行路线。一个进程的内存空间是共享的,所有的线程都能够访问这些内存。打开一个tab页,其实就是创建了一个进程,一个进程可以有多个线程,比如JS引擎线程、GUI渲染线程、HTTP请求线程、定时器触发线程、事件触发线程等。当发起一个请求的时候,其实就是创建了一个线程。当请求结束时,线程可能就会销毁。

JavaScript的单进程与它的用途有关,作为浏览器的脚本语言,javaScript主要是和用户互动,以及操作DOM。如果有两个线程同时操作DOM的话。会带来很复杂的同步问题。

3.事件循环

事件循环的异步队列有两种:一种是宏任务,一种是微任务。宏任务队列可以有多个,微任务队列只有一个。

所有的同步任务都在主线程上执行,形成“执行栈”。首先主线程会去执行所有的同步任务,等所有的同步任务执行完,会查看任务队列里面的异步任务。如果满足条件,那么就重新进入主线程开始执行,这时它就变成了同步任务。等它执行完后,下一个异步任务会进入到主线程开始执行。直到所有的任务执行结束。

第一次事件循环中,js引擎会把整个script代码当成一个宏任务执行。执行完成之后,会查看任务中是否存在微任务,如果有微任务,那么会依次从微任务的队列中将读取执行完所有的微任务。执行完微任务之后,js引擎会继续查看宏任务队列中的任务,依次执行。再执行微任务队列。如此循环。

4.hash路由和history路由

hash(#)是URL的锚点,代表网页中的一个位置,单是改变hash(#)后面的部分,只会滚动到网页响应的位置,并不会重新刷新页面。也就是说hash出现在URL中,但不会被包含在http请求中。因此改变hash不会重新加载页面。同时每一次更改#后面的部分就会在浏览器的历史记录中添加一条数据,使用浏览器的后退按钮就能返回到上一个位置。hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据。

监听hash的改变通过==》hashchange()

histoy模式利用了h5中history interface新增的pushState()和replaceState(),提供了对浏览器记录栈修改的功能,当它们执行修改时,虽然会改变URL,但是不会立即向后端发送请求。这种情况需要后台配置支持。我们的页面时SPA,如果后台没有相应的配置,用户直接访问其中一个页面的时候就会404。在服务端增加一个覆盖所有资源的默认情况。URL如果匹配不到相应的资源,那么返回一个index.html页面。这个页面就是app依赖的页面。

5.深拷贝和浅拷贝的区别?

浅拷贝是拷贝一层。属性为对象时,那么浅拷贝是复制,两个对象会指向同一个地址。

深拷贝是递归拷贝深层次,属性为对象时,深拷贝是新开栈,两个对象指向的是不同地址。

如何实现浅拷贝

(1)Object.assign

(2)ES6的扩展运算符

(3)slice()

(4)concat()

如何实现深拷贝

(1)通过递归的方式实现

6.如何将类数组转换成数组?

Array.from()

Array.apply(null, array)

Array.prototype.concat.apply([], array)

7.如何剪裁图片(选择头像)

https://q.shanyue.tech/fe/js/231.html

8.bind 与 call/apply 的区别是什么

他们都是绑定 this 的,但是bind 返回函数,call/apply 直接执行函数

你可能感兴趣的:(面试,面试,职场和发展)