webveuje/考试/原题/es6/letconst.md
2021-04-29 17:16:40 +08:00

253 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# let const 相关
## 选择
1. 下面代码执行结果为
code:
```
{
let a = 0;
a++
}
console.log(a)
```
A.0 B. 1 C.01 D.报错
答案 D
解析 执行结果为 报错 ReferenceError: a is not defined let声明的变量只在代码块内部有效 var 声明的变量是在全局有效
2. 下面代码执行结果为
code:
```
{
let a = 0;
var b = 1;
}
console.log(a)
console.log(b)
```
A. 0,1 B.报错1 C.报错 空 D. 1 undefined
答案 C
解析 a是在代码块中用let声明的只能在代码块内部访问所以从代码块外面访问不到 然后console.log(a) 就会报错 报错会阻塞下面代码的执行 所以后面的console.log(b) 不执行
3. 下面代码执行结果为
code:
```
let a = 1;
let a = 2;
var b = 3;
var b = 4;
console.log(b)
console.log(a)
a // Identifier 'a' has already been declared
b // 4
```
A.4,报错 B.4,1 C.1,4 D.4,2
答案 A
解析 结果为报错Identifier 'a' has already been declared 意为 a变量已经声明过了
let 声明变量时,只能声明一次 不能重复声明 var 声明变量 可以声明多次
4. 下面代码的执行结果为
code
```
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
```
A. 0~9 B.10个0 C.什么也不输出 D.10个10
答案 D
解析
变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。
5. 下面代码的执行结果为
code:
```
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
```
A.10个0 B.0~9 C.什么也不输出 D.10个10
答案 B
解析
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
6. 下面两段代码的执行结果为
code
```
console.log(a); //ReferenceError: a is not defined
let a = "apple";
```
```
console.log(b); //undefined
var b = "banana";
```
A. 报错 undefined B. undefined banana C.undefined undefined D. apple banana
答案 A
解析
变量 b 用 var 声明存在变量提升所以当脚本开始运行的时候b 已经存在了,但是还没有赋值,所以会输出 undefined。
变量 a 用 let 声明不存在变量提升,在声明变量 a 之前a 不存在,所以会报错。
7. 下面代码的执行结果为
code
```
const PI = "3.1415926";
PI=3.14
console.log("PI")
```
A.PI B.3.1415926 C. 报错 什么都不输出 D.3.14
答案 C
解析 const 声明一个只读变量,声明之后不允许改变
8. 下面代码的执行结果为
code
```
const PI = "3.1415926";
const MY_AGE;
console.log(MY_AGE)
```
A.MY_AGE B.报错 什么都不输出 C.3.1415926 D.undefined
答案 B
解析 报错信息为 Uncaught SyntaxError: missing = in const declaration
const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。
9. 下面代码的执行结果为
```
var PI = "a";
if(true){
console.log(PI);
const PI = "3.1415926";
}
```
A.a B.PI C.ReferenceError: PI is not defined D.3.1415926
答案 C
解析
ES6 明确规定,代码块内如果存在 let 或者 const代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内在声明变量 PI 之前使用它会报错。
10. 下面代码的执行结果为
```
function test(){
for (let i=1;i<3;i++) {
console.log(i)
}
console.log(i)
}
```
A.1,2 B.2,2 C.undefined undefined D.报错
答案 D
解析
1、i 脱离了块作用域let声明的变量只有在块作用域重用小 所以报错
2、我们没有声明i调用的时候应该报undefined错误这里报is not defined 这是为什么呢是因为es6默认强制开启了严格模式“use strict”如果在es5中需要开启严格模式的话在js文件的顶部加上“use strict”
严格模式:变量未声明不能引用
11.下面不属于ECMAScript规范的范围的是
A、数据类型
B、语法
C、DOM事件
D、内置对象和函数的标准库
答案C
解析DOM事件不属于ECMAScript的部分ECMAScript定义的内容语法、类型、原型和继承、内置对象和函数的标准库。
考点: ECMAScript定义规范的理解来自《第一节什么是ES6新手该如何理解》的内容。
12.下面不属于关键字let的特点的是
A、只在 let 命令所在的代码块内有效
B、会产生变量提升现象
C、同一个作用域不能重复声明同一个变量
D、不能在函数内部重新声明参数
答案B
解析使用var关键字才会产生变量提升的现象。关键字let不会产生变量提升现象所以必须先声明定义后使用否则程序抛出异常。
考点关键字let的使用注意事项来自《第二节ES6新增了let关键字干嘛用的》的内容。
13.关于关键字const下列说法错误的是
A、用于声明常量声明后不可修改
B、不会发生变量提升现象
C、不能重复声明同一个变量
D、可以先声明不赋值。
答案D
解析:声明后必须赋值,负责程序会抛出异常。
# 简答题
1. 说出至少5个ES6的新特性并简述它们的作用。
答案 1).let关键字用于声明只在块级作用域起作用的变量
2).const关键字用于声明一个常量
3).解构赋值,一种新的变量赋值方式。常用来交换变量值,提取函数返回值,设置默认值等
4).for-of遍历可用来遍历具有Iterator接口的数据结构(Array,String,Set,Map,arguments,NodeList等)
5).Set结构存储不重复的成员的集合
6).Map结构键名可以是任何类型的键值对集合
7).Promise对象更合理、规范地处理异步操作。
8).Class类定义类和更简便地实现类的继承。
2. es5和es6的区别
答案 ECMAScript5即ES5是ECMAScript的第五次修订于2009年完成标准化ECMAScript6即ES6是ECMAScript的第六次修订于2015年完成也称ES2015ES6是继ES5之后的一次改进相对于ES5更加简洁提高了开发效率
3. var、let、const之间的区别
答案 var声明变量可以重复声明而let不可以重复声明
var是不受限于块级的而let是受限于块级
var会与window相映射会挂一个属性而let不与window相映射
var可以在声明的上面访问变量而let有暂存死区在声明的上面访问变量会报错
const声明之后必须赋值否则会报错
const定义不可变的量改变了就会报错
const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错