乐趣区

ES6面试常见ES6问题集锦14

通过对 ES6 系列文章的学习,相信大家对 ES6 已结有一定程度的了解。

所以本节的目的在于通过测试,便于让大家了解在学习中的知识掌握情况,查缺补漏,一步一个脚印。

1、选择题

1.1 下面不属于关键字 let 的特点的是:()

A、只在 let 命令所在的代码块内有效

B、会产生变量提升现象

C、同一个作用域,不能重复声明同一个变量

D、不能在函数内部重新声明参数

答案:B

解析:使用 var 关键字才会产生变量提升的现象。关键字 let 不会产生变量提升现象,所以必须先声明定义后使用,否则程序抛出异常。

1.2 关于定义常量的关键字 const,定义一个 Object 对象{“name”:”Jack”},再对属性 name 的值进行修改,如:obj.name =“John”。下列说法正确的:()

A、修改常量,程序跑出异常

B、程序不抛出异常,修改无效

C、修改成功,name 的值为 John

D、程序不抛出异常,name 的值为 undefined

答案:C

解析:用 const 来声明一个对象类型的常量,就是传址赋值。而不可修改的是对象在内存中的地址,而不是对象本身。所以修改 name 并不是修改对象的内存地址,所以可以成功修改。

1.3 在对象的解构赋值中,var {a,b,c} = {“c”:10,”b”:9,”a”:8} 结果中,a、b、c 的值分别是:()

A、10 9 8

B、8 9 10

C、undefined 9 undefined

D、null 9 null

答案:B

解析:对象的解构赋值不会受到属性的排列次序影响。

1.4 关于模板字符串,下列说法不正确的是:()

A、使用反引号标识

B、插入变量的时候使用 ${}

C、所有的空格和缩进都会被保留在输出中

D、${}中的表达式不能是函数的调用

答案:D

解析:${}中可以放任意的 JavaScript 表达式,包括运算表达式、对象属性、函数调用等。

1.5 关于字符串扩展的新函数,下面描述错误的是:()

A、includes 函数用于判断字符串中是否含有指定的子字符串

B、repeat 函数将目标字符串重复 N 次,目标字符串被修改

C、startsWidth 函数判断指定的子字符串是否出现在目标字符串头部位置

D、endWidth 函数判断指定的子字符串是否出现在目标字符串尾部位置

答案:B

解析:repeat 函数将目标字符串重复 N 次,会返回一个新的字符串,不影响目标字符串。

1.6 数组扩展的 fill()函数,[1,2,3].fill(4)的结果是:()

A、[4]

B、[1,2,3,4]

C、[4,1,2,3]

D、[4,4,4]

答案:D

解析:fill 函数的参数会把原数组的每个元素填充成指定的参数。

1.7 数组的扩展中,不属于用于数组遍历的函数的是:()

A、keys()

B、entries()

C、values()

D、find()

答案:D

解析:find 函数用于找出数组中符合条件的第一个元素,并不是用于遍历数组。

1.8 关于 Proxy 代理,下面说法错误的是:()

A、可以理解成在目标对象之前,架设一层“拦截”

B、Proxy 的 get 方法用于拦截某个属性的读取操作。

C、Proxy 的 set 方法用于拦截对对象的写操作。

D、一旦对象设置 Proxy 代理后不可取消,所以要谨慎操作

答案:D

解析:可以用 Proxy.revocable()来取消代理,并不是不可以取消的。

1.9 关于 Set 结构的实例方法,下面说法错误的是:()

A、set 方法用于添加成员

B、clear 方法用于清除所有成员。

C、entries 方法返回成员的位置索引和值的遍历器

D、values 方法返回成员值的便利器

答案:C

解析:返回的是键名和键值的遍历器;特别注意的是:set 结构的键名和键值是同一个值。

1.10 下面关于类 class 的描述,错误的是:()

A、JavaScript 的类 class 本质上是基于原型 prototype 的实现方式做了进一步的封装

B、constructor 构造方法是必须的

C、如果类的 constructor 构造方法有多个,后者会覆盖前者

D、类的静态方法可以通过类名调用,不需要实例化

答案:C

解析:同一个类的 constructor 构造方法只能有一个,否则程序会报错。

1.11 关于 Promise 对象的状态,下列说法错误的是:()

A、三种状态分别是:pending 初始状态、fulfilled 成功、rejected 失败

B、pending 初始状态可以状变成 fulfilled 成功

C、rejected 失败不可以状变成 pending 初始状态

D、rejected 失败可以状变成 fulfilled 成功

答案:D

解析:A、B、C 的说法都是正确的,rejected 失败和 fulfilled 成功之间不能相互转换,故 D 选项是错误的。

1.12 关于新特性 Generator 函数的描述,错误的是:()

A、Generator 函数,又称生成器函数

B、声明 Generator 函数的关键字是:function*

C、Generator 函数执行后得到的一个生成器

D、使用 return 语句使 Generator 函数暂停执行,直到 next 方法的调用

答案:D

解析:使函数暂停执行的关键字是 yield,不是 return;return 语句是使函数停止执行并退出。

1.13 Generator 函数的 yield 关键字的作用是:()

A、停止执行

B、退出函数

C、暂停执行,等待 next()方法调用

D、停止执行,可自行恢复执行

答案:C

解析:Generator 函数可以有很多个 yield。而 return 代表的是终止执行,yield 代表的是暂停执行,后续通过调用生成器的 next()方法,可以恢复执行。

1.14 module 模块中,对下列语句的描述,错误的是:()

A、export 导出

B、import 导入

C、export default 默认导出

D、import * as 重命名

答案:D

解析:import as:星号符 实现的是整体导入。而重命名的实现方式是:import {name as myname}。

1.15 在类的继承中,关于 super 的说法错误的是:()

A、在子类的构造函数,必须先调用 super()

B、super 相当于子类的引用

C、先调用 super(),才可以使用 this

D、super()相当于父类构造函数的调用

答案:B

解析:super 是父类的引用,我们可以通过 super 来调用父类的方法和属性。

2、简答题

2.1 说出至少 5 个 ES6 的新特性,并简述它们的作用。(简答题)

答:

 1、let 关键字,用于声明只在块级作用域起作用的变量。2、const 关键字,用于声明一个常量。3、解构赋值,一种新的变量赋值方式。常用于交换变量值,提取函数返回值,设置默认值。4、Symbol 数据类型,定义一个独一无二的值。5、Proxy 代理,用于编写处理函数,来拦截目标对象的操作。6、for...of 遍历,可遍历具有 iterator 接口的数据结构。7、Set 结构,存储不重复的成员值的集合。8、Map 结构,键名可以是任何类型的键值对集合。9、Promise 对象,更合理、规范地处理异步操作。10、Class 类定义类和更简便地实现类的继承。

3、编程题

3.1 使用解构赋值,实现两个变量的值的交换

答:

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


3.2 使用模板字符串改写下面的代码。(ES5 to ES6 改写题)

let iam  = "我是";
let name = "大彬哥";
let str  = "大家好,"+iam+name+", 我想死你们啦。";

改成模板字符串:

let iam  = ` 我是 `;
let name = ` 大彬哥 `;
let str  = ` 大家好,${iam+name}, 我想死你们啦。`;


3.3 promise 对象的用法,手写一个 promise

promise 是一个构造函数,下面是一个简单实例

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


3.4 阅读下面的代码,并用 for…of 改成它。(ES5 to ES6 改写题)

let arr = ['a','b','c','d','e'];
let sum = 'z';
for(let i=0;i<arr.length;i++){sum += arr[i];
}

改:

let arr =  ['a','b','c','d','e'];
let sum = 'z';
for(value of arr){sum += value;}


4、运行分析题

4.1 分析下列程序代码,得出运行结果,解释其原因

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 只有第一次执行有效,多次调用没有任何作用

4.2 以下代码依次输出的内容是?

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。2 3 5 4 1

5、总结

相信通过本次测试,大家又加深了对 ES6 的理解。

对没有完全掌握的部分,接下来可以进行有针对性的训练,那么你将在距离成为大神的道路上,又更近一步啦。

退出移动版