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/

    感谢观看!

  • 相关阅读:
    c++ stl algorithm: std::find, std::find_if
    mysql---多表关联
    使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象
    Nexon由Xsolla全球支付服务
    configure.ac:20: error: Autoconf version 2.65 or higher is required
    的无线通信网络的学习LTE的关键技术HARQ(20141217)
    JAVA 公众微信的开放源码项目管理合作伙伴招募的版本号
    【工具】JAVA 在单元读取文件并比较
    linux下如何编译python生成libpython2.5.so动态库
    将主机IDS OSSEC日志文件存入MYSQL的方法
  • 原文地址:https://www.cnblogs.com/bfc0517/p/6697689.html
Copyright © 2011-2022 走看看