前端程序员面试你应该懂的原生JS——2

1. 谈谈你对JS执行上下文栈和作用域链的理解。

执行上下文就是当前 JavaScript 代码被解析和执行时所在环境, JS执行上下文栈可以认为是一个存储函数调用的栈结构,遵循先进后出的原则。

1.JavaScript执行在单线程上,所有的代码都是排队执行。

2.一开始浏览器执行全局的代码时,首先创建全局的执行上下文,压入执行栈的顶部。

3.每当进入一个函数的执行就会创建函数的执行上下文,并且把它压入执行栈的顶部。当前函数执行-完成后,当前函数的执行上下文出栈,并等待垃圾回收。

4.浏览器的JS执行引擎总是访问栈顶的执行上下文。

5.全局上下文只有唯一的一个,它在浏览器关闭时出栈。

作用域链: 无论是 LHS 还是 RHS 查询,都会在当前的作用域开始查找,如果没有找到,就会向上级作用域继续查找目标标识符,每次上升一个作用域,一直到全局作用域为止。

2. 在JS中什么是变量提升?什么是暂时性死区?

变量提升就是变量在声明之前就可以使用,值为undefined。

在代码块内,使用 let/const 命令声明变量之前,该变量都是不可用的(会抛出错误)。这在语法上,称为“暂时性死区”。暂时性死区也意味着 typeof 不再是一个百分百安全的操作。

typeof x; // ReferenceError(暂时性死区,抛错)

let x;

typeof y; // 值是undefined,不会报错

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

3. prototype 和 __proto__ 区别是什么?

prototype是构造函数的属性。

__proto__ 是每个实例都有的属性,可以访问 [[prototype]] 属性。

实例的 __proto__ 与其构造函数的prototype指向的是同一个对象。

function Student(name) {

this.name = name;

}

Student.prototype.setAge = function(){

this.age=20;

}

let Jack = new Student('jack');

console.log(Jack.__proto__);

//console.log(Object.getPrototypeOf(Jack));;

console.log(Student.prototype);

console.log(Jack.__proto__ === Student.prototype);//true

4. ES6新的特性有哪些?

1.新增了块级作用域(let,const)

2.提供了定义类的语法糖(class)

3.新增了一种基本数据类型(Symbol)

4.新增了变量的解构赋值

5.函数参数允许设置默认值,引入了rest参数,新增了箭头函数

6.数组新增了一些API,如 isArray / from / of 方法;数组实例新增了entries(),keys() 和 values() 等方法

7.对象和数组新增了扩展运算符

8.ES6 新增了模块化(import/export)

9.ES6 新增了 Set 和 Map 数据结构

10.ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例

11.ES6 新增了生成器(Generator)和遍历器(Iterator)

5. setTimeout倒计时为什么会出现误差?

setTimeout() 只是将事件插入了“任务队列”,必须等当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码消耗时间很长,也有可能要等很久,所以并没办法保证回调函数一定会在 setTimeout() 指定的时间执行。所以, setTimeout() 的第二个参数表示的是最少时间,并非是确切时间。

HTML5标准规定了 setTimeout() 的第二个参数的最小值不得小于4毫秒,如果低于这个值,则默认是4毫秒。在此之前。老版本的浏览器都将最短时间设为10毫秒。另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常是间隔16毫秒执行。这时使用 requestAnimationFrame() 的效果要好于 setTimeout();

6. promise 有几种状态, Promise 有什么优缺点 ?

promise有三种状态: fulfilled, rejected, resolved.

Promise 的优点:

1.一旦状态改变,就不会再变,任何时候都可以得到这个结果

2.可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数

Promise 的缺点:

1.无法取消 Promise

2.当处于pending状态时,无法得知目前进展到哪一个阶段

读者福利(学习分享)

对于很多初级web前端工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些架构技术希望对web前端开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,希望对想成为架构师的朋友有一定的参考和帮助。

资料免费领取方式:官方企鹅群:956766604(持续招募中)

下面是部分资料截图

你可能感兴趣的:(前端程序员面试你应该懂的原生JS——2)