我是靠谱客的博主 震动苗条,这篇文章主要介绍ES6新特性(一看就懂)-let,constlet和const命令,现在分享给大家,希望可以做个参考。

let和const命令

let命令

  1. 不允许重复声明
复制代码
1
2
3
4
5
6
7
8
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 // 书写规范:静态字符串一般使用单引号
  1. 不存在变量提升
复制代码
1
2
3
4
5
6
7
8
9
10
11
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';
  • 拓展:变量提升,函数提升以及其优先级关系?
  1. 存在块级作用域
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 情况一 { 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)内层变量可能覆盖外层变量
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var a = '123'; function f() { console.log(a); if (false) { var a = '456'; } } f(); // 打印 undefined

    分析:因为var 声明的变量不存在块级作用域,因此上述代码等同于

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var a = '123'; function f() { var a; console.log(a); if (false) { a = '456'; } } f();

    这里只考虑函数内的变量提升,函数体里声明的变量不会被提升到函数外,同时对于整个代码的变量和函数提升,不做考虑,详情见:变量提升,函数提升以及其优先级关系?

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var a = '123'; function f() { console.log(a); if (false) { a = '456'; } } f(); // 打印 123
    • (2)用来计数的循环变量泄露为全局变量
    复制代码
    1
    2
    3
    4
    5
    6
    var arr = [1, 2, 3]; for(var i = 0; i < arr.length; i++) { console.log(arr[i]) } console.log(i); // 打印 3

    上述代码i在循环结束后,并未消失,在全局环境中依然可以访问到。

  • 案例分析

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var a = []; for (var i = 0; i < 3; i++) { a[i] = function () { console.log(i); }; } a[0](); // 打印 3

    使用let后

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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命令

  1. 声明只读常量,一旦声明,常量的值不能改变。变量名通常用大写字母表示,声明常量一定要赋初始值。
复制代码
1
2
3
4
5
6
const MAX = 99999; MAX = 100000; // Uncaught TypeError: Assignment to constant variable. const MIN; // Uncaught SyntaxError: Missing initializer in const declaration
  1. 存在块级作用域。
  2. 用cost 声明数组和对象,可以修改其属性,但不允许重新赋值。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部