7.0 KiB
let const 相关
选择
- 下面代码执行结果为 code:
{
let a = 0;
a++
}
console.log(a)
A.0 B. 1 C.01 D.报错 答案 D 解析 执行结果为 报错 ReferenceError: a is not defined; let声明的变量只在代码块内部有效 var 声明的变量是在全局有效
- 下面代码执行结果为 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) 不执行
- 下面代码执行结果为 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 声明变量 可以声明多次
- 下面代码的执行结果为 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。
- 下面代码的执行结果为 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 引擎内部会记住前一个循环的值)。
- 下面两段代码的执行结果为 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 不存在,所以会报错。
- 下面代码的执行结果为 code
const PI = "3.1415926";
PI=3.14
console.log("PI")
A.PI B.3.1415926 C. 报错 什么都不输出 D.3.14
答案 C 解析 const 声明一个只读变量,声明之后不允许改变
- 下面代码的执行结果为 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 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。
- 下面代码的执行结果为
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 之前使用它会报错。
- 下面代码的执行结果为
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 解析:声明后必须赋值,负责程序会抛出异常。
简答题
- 说出至少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类,定义类和更简便地实现类的继承。
-
es5和es6的区别 答案 ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化ECMAScript6,即ES6,是ECMAScript的第六次修订,于2015年完成,也称ES2015ES6是继ES5之后的一次改进,相对于ES5更加简洁,提高了开发效率
-
var、let、const之间的区别
答案 var声明变量可以重复声明,而let不可以重复声明 var是不受限于块级的,而let是受限于块级 var会与window相映射(会挂一个属性),而let不与window相映射 var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错 const声明之后必须赋值,否则会报错 const定义不可变的量,改变了就会报错 const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错