概述
let和const命令
let命令
- 不允许重复声明
let a = '123';
let a = '456';
console.log(a); // Uncaught ReferenceError: a is not defined
var b = '123';
var b = '456';
console.log(b); // 456
// 书写规范:静态字符串一般使用单引号
- 不存在变量提升
console.log(a);
let a = '123';
// Uncaught ReferenceError: a is not defined
console.log(b);
var b = '456';
// undefined
// 上面var部分代码等同于
var b;
console.log(b);
b = '456';
- 拓展:变量提升,函数提升以及其优先级关系?
- 存在块级作用域
// 情况一
{
let a = '123';
console.log(a); // 123
}
{
var b = '456';
console.log(b); // 456
}
// 情况二
{
let a = '123';
}
console.log(a); // Uncaught ReferenceError: a is not defined
{
var b = '456';
}
console.log(b); // 456
-
思考:为什么需要块级作用域?
我们知道ES5中有全局作用域和函数作用域,没有块级作用域,可能出现以下问题:
- (1)内层变量可能覆盖外层变量
var a = '123'; function f() { console.log(a); if (false) { var a = '456'; } } f(); // 打印 undefined
分析:因为var 声明的变量不存在块级作用域,因此上述代码等同于
var a = '123'; function f() { var a; console.log(a); if (false) { a = '456'; } } f();
这里只考虑函数内的变量提升,函数体里声明的变量不会被提升到函数外,同时对于整个代码的变量和函数提升,不做考虑,详情见:变量提升,函数提升以及其优先级关系?
var a = '123'; function f() { console.log(a); if (false) { a = '456'; } } f(); // 打印 123
- (2)用来计数的循环变量泄露为全局变量
var arr = [1, 2, 3]; for(var i = 0; i < arr.length; i++) { console.log(arr[i]) } console.log(i); // 打印 3
上述代码i在循环结束后,并未消失,在全局环境中依然可以访问到。
-
案例分析
var a = []; for (var i = 0; i < 3; i++) { a[i] = function () { console.log(i); }; } a[0](); // 打印 3
使用let后
var a = []; for (let i = 0; i < 3; i++) { a[i] = function () { console.log(i); }; } a[0](); // 打印 0
原因:在进行for循环遍历,
使用var 定义变量,方法里面的i相当于全局变量的i,每次遍历,都会改变函数内部i的值,这就意味着当遍历结束,调用a方法,输出的就是跳出循环后i的值。
使用let定义变量,它存在块级作用域,每个a[i]方法都是相互独立,不受影响的,自然i是什么打印什么。
const命令
- 声明只读常量,一旦声明,常量的值不能改变。变量名通常用大写字母表示,声明常量一定要赋初始值。
const MAX = 99999;
MAX = 100000;
// Uncaught TypeError: Assignment to constant variable.
const MIN;
// Uncaught SyntaxError: Missing initializer in const declaration
- 存在块级作用域。
- 用cost 声明数组和对象,可以修改其属性,但不允许重新赋值。
const arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1, 2, 3, 4]
const obj = {
name: 'Tom',
age: 18
}
obj.job = 'student';
obj.age = 28;
console.log(obj);// {name: 'Tom', age: 28, job: 'student'}
arr = [1, 2, 3, 4];// Uncaught TypeError: Assignment to constant variable.
obj = {name: 'Tom', age: 28}; // Uncaught TypeError: Assignment to constant variable.
arr = [1, 2, 3];// Uncaught TypeError: Assignment to constant variable.
原因:用const声明数组和对象,只要当前元素的指针指向的地址不变,则进行相应操作不会报错,如果重新赋值,则会指向新的地址,就算原数组对象和新数组对象一模一样,也会报错。
最后
以上就是震动苗条为你收集整理的ES6新特性(一看就懂)-let,constlet和const命令的全部内容,希望文章能够帮你解决ES6新特性(一看就懂)-let,constlet和const命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复