ES6—面试常见ES6问题集锦(14)

55

通过对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的理解。

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


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

最后变成如果 · 5月24日

看着都好简单,但是面试的时候,脑子反应速度还是差点啊~

回复

有欲观徼 · 5月29日

14题好像出错了,import * as 重命名 from 这种方式是可以的

回复

载入中...