es6之 let&const

  • let 声明了一个块级域的局部变量
  • const 声明一个块级域的只读的常量

    let 和 const 共有的特性:

  • 不存在变量提升

    console.log(a); // undefined
    console.log(b); // Uncaught ReferenceError: b is not defined(…)
    var a = 1;
    let b = 2; // 或 const b = 2;
  • 都存在暂时性死区
    在代码块内,使用 let const 命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区(temporal dead zone,简称TDZ)。

    if (true) {
      // TDZ开始
      tmp = ‘abc‘; // ReferenceError
      console.log(tmp); // ReferenceError
      let tmp; // TDZ结束
      console.log(tmp); // undefined
      tmp = 123;
      console.log(tmp); // 123
    }

    ES6规定暂时性死区和 letconst 语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。

  • 同一作用域内,不允许重复声明
    {
      let a = 1;
      var a = 2; // Uncaught SyntaxError: Identifier ‘a‘ has already been declared
    }
    // test 2
    {
      const b = "const";
      let b; // // Uncaught SyntaxError: Identifier ‘b‘ has already been declared
    }
  • 顶层对象的属性脱钩
    letconst 声明的全局变量,不属于顶层对象的属性。
    var a = 1;
    let b = 2;
    const c = 3;
    console.log(window.a); // 1
    console.log(window.b); // undefined
    console.log(window.c); // undefined

    块级作用域:

    ES6 引入了块级作用域,ES6 规定,允许在块级作用域之中声明函数,考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

    // 函数声明语句

    {

    let a = ‘secret‘;

    function f() {

    return a;

    }

    }

    // 函数表达式

    {

    let a = ‘secret‘;

    let f = function () {

    return a;

    };

    }

     const:

  • const 声明的常量不能对其进行赋值,否则报错
    const PI = 3.1415926;
    PI = 3.14; // Uncaught TypeError: Assignment to constant variable.(…)
  • const 必须在声明变量的同时并进行初始化,否则报错

    const a; // Uncaught SyntaxError: Missing initializer in const declaration
  • 对于用 const 声明的复合类型的变量(比如一个对象),和 var 一样,变量名不指向数据,而是指向数据所在的地址,只不过这个变量的值(对象的地址)不能变而已。所以可以自由更改复合类型的数据。所以,请慎重将对象声明为常量
  • 如果你想冻结一个对象,使用 Object.freeze(obj);

    const obj = {};
    console.log(obj);  // Object {}
    obj.name = "percy";
    console.log(obj);  // Object {name: "percy"}
    obj = {}; // 报错,Uncaught TypeError: Assignment to constant variable.(…)
    // 清除上面的错误,继续上面的代码
    Object.freeze(obj);  // 冻结 obj
    obj.age = "21";      // 默认忽略更改,严格模式下报错
    console.log(obj);    // Object {name: "percy"}
时间: 2024-10-29 01:01:29

es6之 let&const的相关文章

ES6基础之const声明

问题 今天在分析React教程时,观察到如下代码: class Board extends React.Component { constructor(props) { super(props); this.state = { squares: Array(9).fill(null), }; } handleClick(i) { const squares = this.state.squares.slice(); squares[i] = 'X'; this.setState({squares

ES6(二) let const

一:let 1.块级作用域 外层作用域无法读取内层作用域的变量. 2.不存在变量提升 3.TDZ:暂时性死区 "暂时性死区"也意味着typeof不再是一个百分之百安全的操作. 这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错. 变量没声明和声明不赋值,返回的都是undefined. 总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量. 4.不允许重复声明 5.

es6中let,const区别与其用法

ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScript定义了很多东西,如: 语法-----解析规则,关键字,语句,声明,操作等 类型-----布尔型,数字,字符串,对象等 原型和继承 内置对象,函数的标准库----------JSON, Math, 数组方法,对象方法等 浏览器兼容: 目前Google和Firefox浏览器对ES6新特性的兼容最友好

ES6 let和const 命令

一.let命令 使用的注意事项: 1.es6新增了let命令,它的用法和var 差不多,但是它声明的变量只在let命令所在的代码块有效 2.不存在变量提升,所以变量要声明后再使用,不然会报错 3.不允许在相同的作用域中重复声明同一个变量,所以也不能在函数里重新声明参数 4.let为js新增了块级作用域,这样就能避免变量的全局污染 4-1.为什么需要块级作用域 1.在es5中,函数作用域:内层变量可能会覆盖外层变量 2.用来计数的循环变量泄露为全局变量 4-2.es6中的块级作用域 1.避免循环变

ES6:let const

es5 声明变量 var variable = value; 存在的问题: 变量提升引起的问题 function get(condition) { if(condition) { var value = 'test'; return value; }else { return null; } } 在JS的预编译阶段,JS引擎会将上面的函数修改如下: function get(condition) { var value; if(condition) { value = 'test'; retur

ES6浅谈--const,数组解构

关于const: 1.const声明的基本类型的值不可重复声明,不可修改,声明之后需要初始化,声明存在暂时性死区,只在声明的块级作用域内有效. 2.const本质上确保的是变量的内存地址的数值不会被改动,所以对于基本类型的值来说,数值在栈中保存,不会被修改:但是对于对象来说,const声明的对象不可以被改变的是内存地址,数据存在堆中,是可以被修改的,如果想不被修改需要freeze. 3.冻结对象后不能新添加属性,但是还可以修改原有属性,所以需要彻底冻结所有属性. 4.浏览器环境下顶层对象和全局对

es6 part 1 //const let

1. let 命令 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 上面代码在代码块之中,分别用let和var声明了两个变量.然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值.这表明,let声明的变量只在它所在的代码块有效. for循环的计数器,

ES6中的const命令【转】

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio

ES6中的const命令

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio