ES6面试常考知识点


前言

ES6常考面试知识点总结


1.ES5与ES6的区别,ES6新增的方法有哪些?

ES6新增的方法:

  • let 与 const指令
    都是块级作用域。以{}代码块作为作用域范围 只能在代码块里面使用
    不存在变量提升,只能先声明再使用,否则会报错。语法上,称为“暂时性死区”在同一个代码块内,不允许重复声明
    const 声明的是一个只读常量,在声明时就需要赋值。(如果 const 的是一个对象,对 象所包含的值是可以被修改的。抽象一点儿说,就是对象所指向的地址不能改变,而变量成员是可以修改的。)

  • 模板字符串
    用一对反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,也可以在字符串中嵌入变量,js 表达式或函数,变量、js 表达式或函数需要写在${ }中。

  • 函数的扩展
    箭头函数,箭头函数的this始终指向箭头函数定义时离this最近的一个函数,如果没有最近的函数,则指向最近的函数即window属性的关系

  • 对象的扩展

//属性的简写
var foo = 'bar';
var baz = {foo};

//Object.keys()方法的使用 获取对象的所有属性名或方法名(不包括原形的内容),返回一个数组。
var obj={name: "john", age: "21", getName: function () { alert(this.name)}};
console.log(Object.keys(obj)); // ["name", "age", "getName"]
console.log(Object.keys(obj).length); //3
console.log(Object.keys(["aa", "bb", "cc"])); //["0", "1", "2"]
console.log(Object.keys("abcdef")); //["0", "1", "2", "3", "4", "5"]

//Object.assign将多个原对象的属性和方法都合并到了目标对象上面。可以接收多个参数,第一个参数是目标对象,后面的都是源对象
var target = {}; //目标对象
var source1 = {name : 'ming', age: '19'}; //源对象 1
var source2 = {sex : '女'}; //源对象 2
var source3 = {sex : '男'}; //源对象 3,和 source2 中的对象有同名属性 sex
Object.assign(target,source1,source2,source3);
console.log(target); //{name : 'ming', age: '19', sex: '男'}
  • for…of 循环遍历数组 for…in 循环遍历对象
  • import 与 export 功能的使用
    export 用于对外输出本模块(一个文件可以理解为一个模块)变量的接口
    import 用于在一个模块中加载另一个含有 export 接口的模块
    import 和 export 命令只能在模块的顶部与底部,不能在代码块之中
  • Promise对象的使用
    Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用reject。 对于已经实例化过的 Promise 对象可以调用Promise.then() 方法,传递 resolve 和 reject 方法作为回调。then()方法接收两个参数:onResolve 和 onReject,分别代表当前 Promise 对象是成功或失败时
    Promise 的 3 种状态
    Fulfilled 为成功的状态,Rejected 为失败的状态,Pending 既不是 Fulfilld 也 不 是Rejected 的状态,可以理解为 Promise 对象实例创建时候的初始状态
  • 解构赋值 数组、对象两类
  • Set数据结构 所有的数据都是唯一的,没有重复的值。它本身是一个构造函数。可应用于数组的去重
  • class 类的继承不再像ES5一样使用原型链实现继承,而是引入了类这种概念

2.ES6与ES5继承方式的区别

ES5 的继承是通过原型或者是构造函数机制来实现
ES6 用过 class 关键字定义类,里面有构造方法,类之间通过 extends 关键字实现,子类必须 在 constructor 方法中调用 super 方法

3.var、let与const区别

var 声明变量可以重复声明,而 let 不可以重复声明

var 是不受限于块级的,而 let 是受限于块级

var 会与 window 相映射(会挂一个属性),而 let 不与 window 相映射

var 可以在声明的上面访问变量,而 let 有暂存死区,在声明的上面访问变量会报错

const 声明之后必须赋值,否则会报错

const 定义不可变的量,改变了就会报错

const 和 let 一样不会与 window 相映射、支持块级作用域、在声明的上面访问变量会报错

4.class与extends的定义,有什么作用?

ES6 的 Class 可以看作只是一个 ES5 生成实例对象的构造函数的语法糖。

extends 是 ES6 引入的关键字,其本质仍然是构造函数+原型链的组合式继承。class 类可以通过 extends 实现继承。

5.module、export与import的作用是什么?

import 引入的模块是静态加载(编译阶段加载)而不是动态加载(运行时加载)。
import 引入 export 导出的接口值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。

6.箭头函数与普通函数的区别

使用箭头函数,this不是指向window,而是指向父级元素

不能够使用 arguments 对象

不能用作构造函数,这就是说不能够使用 new 命令,否则会抛出一个错误

不可以使用 yield 命令,因此箭头函数不能用作 Generator 遍历器函数

7.说一下set与map的区别

set:成员不能重复;只有键值没有键名,类似数组;可以循环遍历,有add、delete和has方法
map:属于键值对的集合,遍历完成各种数据格式转换

8.怎么获取多个Promise最后的整体结果?

promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例

9.Promise中reject与catch处理方法中的不同?

reject 是用来抛出异常,catch 是用来处理异常

reject 是 Promise 的方法,而 catch 是 Promise 实例的方法

reject 后的东西,一定会进入 then 中的第二个回调,如果 then 中没有写第二个回调,则进入catch网络异常(比如断网),会直接进入 catch 而不会进入 then 的第二个回调函数内容

10.手写一个Promise函数

var Promise = new Promise((resolve, reject) => {
if (success) {
resolve(value)
} else {
reject(error)
}
})
Promise.then(function (value) {
// success
}, function (value) {
// failure
})

11.Promise函数代码的实例教程

const Promise = new Promise((resolve, reject) => {
console.log(2);
resolve();
console.log(333);
})
Promise.then(() => {
console.log(666);
})
console.log(888)
//Promise 新建后立即执行,所以会先输出 2,333,而 Promise.then()内部的代码在当次事件循环的 结尾立刻执行,所以会继续输出888,最后输出 666.
setTimeout(function () {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
console.log(2);
for (var i = 0; i < 10000; i++) {
i == 9999 && resolve();
}
console.log(3);
}).then(function () {
console.log(4);
});
console.log(5);
//首先先碰到一个 setTimeout,于是会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出1。然后是一个 Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。然后,Promise 的 then 应当会放到当前 tick 的最后,但是还是在当前 tick 中。因此,应当先输出5,然后再输出4,最后在到下一个tick,就是1。
const Promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
Promise.then(() => {
console.log(3)
})
console.log(4)
运行结果:1 2 4 3
//Promise 构造函数是同步执行的,Promise.then 中的函数是异步执行的。
const Promise = new Promise((resolve, reject) => {
resolve('success1')
reject('error')
resolve('success2')
})
Promise
.then((res) => {
console.log('then: ', res)
}).catch((err) => {
console.log('catch: ', err)
})
//运行结果:then: success1 构造函数中的 resolve 或 reject 只有第一次执行有效,多次调用没有任何作用

12.解构赋值完成两个变量值的交换

let a = 1;
let b = 2;
[a,b] = [b,a]

13.ES6中常见导入导出模块的使用

//导入模块
//导入一个模块
import {sum} from "./example.js"
//导入多个模块
import {sum,multiply,time} from "./exportExample.js"
// 导入一整个模块
import * as example from "./exportExample.js"

//导出模块
//可以将 export 放在任何变量,函数或类声明的前面
export var firstName = 'Chen';
export var lastName = 'Sunny';
export var year = 1998;

var firstName = 'Chen';
var lastName = 'Sunny';
var year = 1998;
export {firstName, lastName, year};

//使用 export default 时,对应的 import 语句不需要使用大括号
let bosh = function crs(){}
export default bosh;
import crc from 'crc';

//不使用 export default 时,对应的 import 语句需要使用大括号
let bosh = function crs(){}
export bosh;
import {crc} from 'crc';

总结

未完待续…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值