zoukankan      html  css  js  c++  java
  • let 和 const 关键字

    看了阮老师的ES6入门再加上自己的一些理解整理出的学习笔记

    let关键字

    • 跟var相比,不会提升为全局变量,始终是块级作用域{}
    • 注意点:
      • 1: 不能在同一个块级作用域内声明同名变量
      • 2: (如果当前块级作用域内{}内部没有该变量的声明)向上级作用域查找,如果有声明,就只在本块级作用域中查找 let num = 1;if(true){console.log(num) //1}  
      • 3: 各个块级作用域内声明的变量是独立使用的,在更小的作用域内可以使用更大作用域的变量 let num =1 ; if(true){ let num = 2;//2 } //1 

    const关键字

    • const声明一个只读的常量,一旦声明,常量的值就不能改变。
    • 也是块级作用域,不存在变量类型提升
      • const不仅不允许不声明直接使用,而且必须一次性完成初始化(声明+赋值)
      • 同一个块级作用域内不允许声明同名的常量
      • 不允许被二次赋值,而可以被挂载属性

    引用阮老师写在《ECMAScript 6 入门》中的一段话:

    const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

    const foo = {};
    
    // 为 foo 添加一个属性,可以成功
    foo.prop = 123;
    foo.prop // 123
    
    // 将 foo 指向另一个对象,就会报错
    foo = {}; // TypeError: "foo" is read-only

    上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

    小总结:

    • 不管是let还是const ,都是块级作用域,都必须至少是先声明,才能使用(严格模式)
    • let 可以先声明,后赋值,const必须一次完成
    • 两者都不允许在同一个块级作用域内声明同名

    最后附上书籍地址http://es6.ruanyifeng.com/

    感谢观看!

  • 相关阅读:
    [转载]IntelliJ IDEA常用设置
    sql server字段合并逗号隔开
    sql server字段合并逗号隔开
    [转载]Hana 学习资源
    SQL Server数据库实现异地备份
    SQL Server数据库实现异地备份
    SQL Server blocked access to procedure 'sys.xp_cmdshell'
    调用另一个进程,createprocess返回值正确,但被调进程连入口函数都没进入。
    需求做完后,需要拉相关人员确认下结果
    exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
  • 原文地址:https://www.cnblogs.com/bfc0517/p/6697689.html
Copyright © 2011-2022 走看看