ES6 let 与 const 与 var

ES 6 是什么?

  • ECMA Script 6(简称ES6)是JavaScript语言的最新一代标准。因为 ES6 是在2015年发布的,所以又称ECMAScript 2015。
  • ECMAScript 是由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过 ECMA-262 标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
  • 最常用的ES6特性
  1. let, const,
  2. class, extends, super, arrow functions, template string, destructuring, default, rest arguments
  • Java定义变量有三种方式,最传统古老的 var、以及 ES 6 新增的 let、const
  • var定义变量的方式现在慢慢的开始舍弃

var

  1. var 变量无块范围,最小可见范围是函数级。
  2. var 变量申明被提升至函数顶部。
  3. var定义的变量可以修改,如果不初始化会输出undefined,不会报错。

示例 1:var 定义的是全局变量或函数变量,没有let块区域变量的概念,var可以越过块区域

<script type="text/javascript">
    /**var没有块区域,仅为全局或函数区域,可以越过块区域*/
    if (true) {
        var flag = true;
    }
    /**上面的if、以及whilefor等都属于块区域,var是可以无视的
     * 所以这里会输出"true"*/
    console.log(flag);//输出true
</script>
<script type="text/javascript">
    $(function () {
        for (var i = 0; i < 5; i++) {
            console.log("inner"+i);
        }
        /**var定义的全局变量,此时照样能读到for中的i*/
        console.log("outer"+i);//输出"outer5"
    });
</script>

<script type="text/javascript">
    function show(){
        var userName = "芷若";//这个userName属于函数级别变量
        console.log(userName);
    }
    /**上面方法中定义的变量,只会在方法中有效,此时下面报错:
     * letAndVar.html:13 Uncaught ReferenceError: userName is not defined*/
    console.log(userName);
</script>

示例2 :var定义的变量可以先使用,再声明,但不建议这么做,实际开发中应该先声明再使用

<script type="text/javascript">
    /**输出变量在声明变量之前,结果为undefined,等价于下面三句
     * var age;
     * console.log(age);
     * age = 13;
     * */
    console.log(age);//输出undefined
    var age = 13;

    /**如果输出的变量前后都未使用var声明,则运行时报错:
     * Uncaught ReferenceError: userName is not defined
     */
    console.log(userName);
</script>

let

  • let 声明的变量,只在let命令所在的代码块内有效,即只在{}内有效,它的粒度比var更细腻
  • let 用法与 var 相同,区别主要在于作用范围不一样,性能上let比var更强
  • let是块级作用域,函数内部使用let定义后,对函数外部无影响。

示例 1:let定义的变量只在局部的{}中有效,所以不会和外面的发生冲突, 如果换成var定义显然里面的会覆盖外面的,更容易出错

<script type="text/javascript">
    $(function () {
        for (let i = 0; i < 3; i++) {
            console.log("outer:"+i);
            /**let定义的变量只在局部的{}中有效,所以下面并不会和外面的i冲突
             * 如果换成var定义显然里面的会覆盖外面的,更容易出错*/
            for (let i = 0; i < 3; i++) {
                console.log("innner:"+i);
            }
        }
    });
</script>

ES6 let 与 const 与 var

示例2:let声明的变量未赋值时,默认为undefined

<script type="text/javascript">
    /**声明了userName,但未赋值时,输出undefined*/
    let userName;
    console.log(userName);//输出undefined

    /**直接使用未声明的变量时,直接报错:
     * Uncaught ReferenceError: age is not defined*/
    console.log(age);
</script>

const

  • const用来声明常量,声明的同时必须初始化值,否则运行时浏览器报错;
  • const 声明且初始化值之后,常量的值就不能改变,否则直接编译不通过
<script type="text/javascript">
    $(function () {
        /**声明常量的时候必须初始化值*/
        const PI = Math.PI;
        console.log(PI);//输出:3.141592653589793

        /**如果常量E声明的同时没有初始化值,则运行时浏览器报错:
         * Uncaught SyntaxError: Missing initializer in const declaration*/
        const E;
    });
</script>