共计 4229 个字符,预计需要花费 11 分钟才能阅读完成。
通过对 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 的理解。
对没有完全掌握的部分,接下来可以进行有针对性的训练,那么你将在距离成为大神的道路上,又更近一步啦。