前端面试题 -- JavaScript(二)

媒介

上一篇 前端面试题-JavaScript(一), 感兴致的小伙伴也能够移步这里检察 完整版JavaScript面试题,面试题会不定期更新加进去一些个人事情中碰到的或许以为比较主要的东西,背面会涉及到前端的各个方面,感兴致的小伙伴能够关注哦!

假如文章中有涌现马虎、毛病的地方,还请看到的小伙伴留言斧正,先行谢过

以下 ↓

1. 同步和异步的区分,怎样异步加载 JavaScript

同步形式

同步形式,又称壅塞形式。javascript 在默许情况下是会壅塞加载的。当前面的 javascript 要求没有处置惩罚和实行完时,会阻挠浏览器的后续处置惩罚

异步形式

异步加载又叫非壅塞,浏览器在下载实行 js 同时,还会继续进行后续页面的处置惩罚

异步加载 JavaScript

  • 动态增加 script 标签
  • defer
  • async

defer属性和
async都是属于
script 标签上面的属性,二者都能完成
JavaScript 的异步加载。差别的地方在于:
async 在异步加载完成的时刻就立时最先实行了,
defer 会比及
html 加载终了今后再实行

2. 跨域题目的发作,怎样处理它

因为浏览器的
同源战略,在涌现 域名、端口、协定有一种不一致时,就会涌现跨域,属于浏览器的一种平安限定。

处理跨域题目有很多种体式格局,经常运用的就是以下几种:

  • jsonp 跨域:动态建立script,再要求一个带参网址完成跨域通讯.瑕玷就是只能完成 get 一种要求
  • document.domain + iframe跨域:两个页面都经由历程js强迫设置document.domain为基本主域,就完成了同域.然则仅限主域雷同,子域差别的跨域运用场景
  • 跨域资源共享(CORS):只服务端设置Access-Control-Allow-Origin即可,前端不必设置,若要带cookie要求:前后端都须要设置
  • nginx反向代办接口跨域:同源战略是浏览器的平安战略,不是HTTP协定的一部份。服务器端挪用HTTP接口只是运用HTTP协定,不会实行JS剧本,不须要同源战略,也就不存在逾越题目
  • WebSocket协定跨域

3. 对 this 的明白

JavaScript 中,研讨 this 平常都是 this 的指向题目,中心就是 this 永久指向终究挪用它的谁人对象,除非转变 this 指向或许箭头函数那种特别情况

function test() {
    console.log(this);
}

test() // window

var obj = {
  foo: function () { console.log(this.bar) },
  bar: 1
};

var foo = obj.foo;
var bar = 2;

obj.foo() // 1
foo() // 2

// 函数挪用的环境差别,所获得的效果也是不一样的

4. apply()、call()和 bind() 是做什么的,它们有什么区分

雷同点:三者都能够转变 this 的指向

差别点:

  • apply 要领传入两个参数:一个是作为函数上下文的对象,别的一个是作为函数参数所构成的数组

var obj = {
    name : 'sss'
}

function func(firstName, lastName){
    console.log(firstName + ' ' + this.name + ' ' + lastName);
}

func.apply(obj, ['A', 'B']);    // A sss B
  • call 要领第一个参数也是作为函数上下文的对象,然则背面传入的是一个参数列表,而不是单个数组
var obj = {
    name: 'sss'
}

function func(firstName, lastName) {
    console.log(firstName + ' ' + this.name + ' ' + lastName);
}

func.call(obj, 'C', 'D');       // C sss D
  • bind 接收的参数有两部份,第一个参数是是作为函数上下文的对象,第二部份参数是个列表,能够接收多个参数
var obj = {
    name: 'sss'
}

function func() {
    console.log(this.name);
}

var func1 = func.bind(null, 'xixi');
func1();

apply
call 要领都会使函数马上实行,因而它们也能够用来挪用函数

bind 要领不会马上实行,而是返回一个转变了上下文 this 后的函数。而原函数 func 中的 this 并没有被转变,照旧指向全局对象 window

bind 在通报参数的时刻会将本身带过去的参数排在原函数参数之前

function func(a, b, c) {
    console.log(a, b, c);
}
var func1 = func.bind(this, 'xixi');
func1(1,2) // xixi 1 2

5. 什么是内存走漏,哪些操纵会形成内存走漏

内存走漏:是指一块被分派的内存既不能运用,又不能接纳,直到浏览器历程完毕

能够形成内存走漏的操纵:

  • 不测的全局变量
  • 闭包
  • 轮回援用
  • 被忘记的定时器或许回调函数

你能够还须要晓得 渣滓接纳机制 另外,高程上面临渣滓接纳机制的引见也很周全,有兴致的小伙伴能够看看

6. 什么是事宜代办,它的道理是什么

事宜代办:浅显来讲就是将元素的事宜托付给它的父级或许更外级元素处置惩罚

道理:应用事宜冒泡机制完成的

长处:只须要将同类元素的事宜托付给父级或许更外级的元素,不须要给一切元素都绑定事宜,削减内存空间占用,提拔机能; 动态新增的元素无需从新绑定事宜

7. 对AMD和CMD的明白,它们有什么区分

AMD
CMD都是为了处理浏览器端模块化题目而发作的,
AMD范例对应的库函数有
Require.js
CMD范例是在国内发展起来的,对应的库函数有
Sea.js

AMD和CMD最大的区分是对依靠模块的实行机遇处置惩罚差别

1、AMD推重依靠前置,在定义模块的时刻就要声明其依靠的模块

2、CMD推重就近依靠,只需在用到某个模块的时刻再去require

参考:AMD-中文版 CMD-范例

8. 对ES6的相识

ECMAScript 6.0 是 JavaScript 言语的下一代规范

新增的特征:

  • 声明变量的体式格局 let const
  • 变量解构赋值
  • 字符串新增要领 includes() startsWith() endsWith()
  • 数组新增要领 Array.from() Array.of() entries() keys() values()
  • 对象简约写法以及新增要领 Object.is() Object.assign() entries() keys() values()
  • 箭头函数、rest 参数、函数参数默许值等
  • 新的数据结构: SetMap
  • Proxy
  • Promise对象
  • async函数 await敕令
  • Class
  • Module 系统 模块的加载和输出体式格局

相识更多,参考 ES6入门-阮一峰

9. 箭头函数有什么特性

ES6 许可运用“箭头”(=>)定义函数

var f = v => v;

// 等同于
var f = function (v) {
  return v;
}

注重点:

  • 函数体内的 this 对象,就是定义时地点的对象,而不是运用时地点的对象
  • 不能够看成组织函数,也就是说,不能够运用 new 敕令,否则会抛出一个毛病
  • 不能够运用 arguments 对象,该对象在函数体内不存在。假如要用,能够用 rest 参数替代

10. Promise 对象的相识

Promise 是异步编程的一种处理方案,比传统的处理方案——回调函数和事宜——更合理和更壮大.所谓Promise,简单说就是一个容器,内里保存着某个将来才会完毕的事宜(通常是一个异步操纵)的效果 –ES6入门-阮一峰

Promise 对象代表一个异步操纵,有三种状况:pending(进行中)、fulfilled(已胜利)和 rejected(已失利)。只需异步操纵的效果,能够决议当前是哪种状况,任何其他操纵都没法转变这个状况

特性:

  • 对象的状况不受外界影响
  • 一旦状况转变,就不会再变,任何时刻都能够获得这个效果
  • Promise 新建后就会马上实行
const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操纵胜利 */){
    resolve(value);
  } else {
    reject(error);
  }
})

Promise实例天生今后,能够用then要领离别指定resolved状况和rejected状况的回调函数

promise.then(function(value) {
  // success
}, function(error) {
  // failure
})

then 要领返回的是一个新的Promise实例

Promise.prototype.catch 用于指定发作毛病时的回调函数,具有“冒泡”性子,会一向向后通报,直到被捕捉为止。也就是说,毛病老是会被下一个catch语句捕捉

getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 处置惩罚前面三个Promise发作的毛病
});

catch 要领返回的照样一个
Promise 对象,因而背面还能够接着挪用
then 要领

出去上述要领,Promise另有其他用法,小伙伴们能够在这里检察大佬写的文章 ES6入门-阮一峰

11. async 函数以及 awit 敕令

async 函数是什么?一句话,它就是
Generator 函数的语法糖

相识Generator函数的小伙伴,这里 传送门

async 特性:

async 函数返回一个
Promise 对象,能够运用
then 要领增加回调函数。当函数实行的时刻,一旦碰到
await 就会先返回,比及异步操纵完成,再接着实行函数体内背面的语句

async 函数内部 return 语句返回的值,会成为 then 要领回调函数的参数

async 函数返回的 Promise 对象,必需比及内部一切 await 敕令背面的 Promise 对象实行完,才会发作状况转变,除非碰到 return 语句或许抛出毛病

async 函数内部抛出毛病,会致使返回的 Promise 对象变成 reject 状况。抛出的毛病对象会被 catch 要领回调函数接收到

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

await 敕令:
await 敕令背面是一个
Promise 对象,返回该对象的效果。假如不是
Promise 对象,就直接返回对应的值

async function f() {
  // 等同于
  // return 123;
  return await 123;
}

f().then(v => console.log(v))
// 123

await 敕令背面是一个
thenable对象(即定义then要领的对象),那末
await会将其等同于
Promise 对象.也就是说就算一个对象不是
Promise对象,然则只需它有
then这个要领,
await 也会将它等同于
Promise对象

运用注重点:

  • await 敕令背面的 Promise 对象,运转效果多是 rejected,所以最好把 await 敕令放在 try...catch 代码块中
  • 多个 await 敕令背面的异步操纵,假如不存在继发关联,最好让它们同时触发
  • await 敕令只能用在 async 函数当中,假如用在一般函数,就会报错

相识更多,请点击 这里

12. export 与 export default有什么区分

export
export default 都可用于导出常量、函数、文件、模块等

在一个文件或模块中,exportimport 能够有多个,export default 唯一一个

经由历程 export 体式格局导出,在导入时要加 { }export default 则不须要

运用 export default敕令,为模块指定默许输出,如许就不须要晓得所要加载模块的变量名; export 加载的时刻须要晓得加载模块的变量名

export default 敕令的实质是将背面的值,赋给 default 变量,所以能够直接将一个值写在 export default 今后

13. 前端机能优化

拜见 雅虎14条前端机能优化

14. 对JS引擎实行机制的明白

首选明白两点:

JavaScript 是单线程言语

JavaScriptEvent LoopJS 的实行机制, 也就是事宜轮回

console.log(1)
    
setTimeout(function(){
    console.log(2)
},0)

console.log(3)

// 1 3 2

JavaScript 将使命分为同步使命和异步使命,实行机制就是先实行同步使命,将同步使命加入到主线程,碰到异步使命就先加入到
event table ,当一切的同步使命实行终了,假如有可实行的异步使命,再将其加入到主线程中实行

视频详解,移步 这里

setTimeout(function(){console.log(1);},0);
new Promise(function(resolve){
     console.log(2);
     for(var i = 0; i < 10000; i++){
         i == 99 && resolve();
     }
 }).then(function(){
     console.log(3)
 });
 
 console.log(4);
 
 // 2 4 3 1

在异步使命中,定时器也属于特别的存在。有人将其称之为 宏使命、微使命,定时器就属于宏使命的领域。

参考 JS引擎的实行机制

跋文

总结的历程,本身确切也获益颇多,谢谢前行的小伙伴。

GitHub完整版面试题,迎接小伙伴们star关注

预祝人人都能找到本身惬意的事情

以上

    原文作者:游荡de蝌蚪
    原文地址: https://segmentfault.com/a/1190000018575931
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞