ES6特性:变量(let、const)

变量声明

在ES5中,我们通常使用var声明一个变量,但是var有很多奇葩的特性,这些特性与常规的编程语言都不太相同,在ES6中,又提供了与常规语言类似的声明变量的方法。

let关键字

使用let来声明一个变量,let对比var有如下特点:

  • 变量声明不会被提升,即在变量声明之前无法使用该变量
  // 报错,不能在变量声明前使用该变量
  console.log(a);
  let a = 1;
  • 具有块级作用域,即let声明的变量只能在对应代码块中使用
  {
  	let a = 1;
  }
  // 报错
  console.log(a);
  • 不允许重复声明
  let a = 1;
  // 下方代码报错,不能重复声明a变量
  let a = 2;
  • 不影响作用域链
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>let变量经典案例</title>
</head>

<body>
    <!-- 点击切换颜色 -->
    <div class="container">
        <h2 class="page-header">点击切换颜色</h2>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <script>
        let items = document.getElementsByClassName("item");

        // 第一种方式:可行
        for (let i = 0; i < items.length; i++) {
            items[i].onclick = function () {
                //修改当前元素背景颜色
                this.style.background = "pink";
            }
        }

        // 第二种方式:不可行
        for(var i = 0; i<items.length; i++){
            items[i].onclick = function(){
                items[i].style.background = "pink";
            }
        }

        /* 为什么不可行呢?
        使用var每次定义i时,并没有局部定义域,i是在全局作用域中存在的。
        这里的i是一个全局变量,在经过自增之后,最终i变为了3,
        在点击div时会调用回调函数,并且会一层一层往上找变量i,
        而此时的i是全局变量,且i=3,找不到对应要调用的回调函数,
        所以没有效果。
        */

        // 第三种方式:将var用let代替,可行
        for (let i = 0; i < items.length; i++) {
            items[i].onclick = function () {
                items[i].style.background = "pink";
            }
        }
        /* 原理是:
            let自身具有局部作用域,每次用let声明一个变量时,都会创建局部作用域,如下
            {
                let i = 0;
                items[i].onclick = function () {
                    items[i].style.background = "pink";
                }
            }
            当触发回调函数时,会一直往上层作用域找,直到找到i,此时i=0,所以就有结果显示。
        */
    </script>
    <style>
        .item {
            height: 50px;
            width: 70px;
            margin: 5px;
            border: 5px solid aqua;
        }
    </style>
</body>
</html>

const关键字

const用于声明常量,const具有与let相同的特性,此外还有一些其他特性。

// 常量
const PI = 3.14;
console.log(PI);
  • 常量声明不会被提升,即在变量声明之前无法使用该常量。
  // 报错,不能在常量声明前使用该变量
  console.log(b);
  const b = 2;
  • 具有块级作用域,即const声明的常量只能在对应作用域范围内中使用.
  {
  	const b = 2;
  }
  // 报错
  console.log(b);
  • 不允许重复声明。
  const b = 2;
  // 下方代码报错,不能重复声明b常量
  const b = 3;
  • 在声明的时候就需要赋值,并且只能赋值一次,不能修改。
  // 报错,没有赋值
  const b;
  const c = 2;
  // 报错,重复赋值
  c = 3;
  • 对数组或者对象中的元素的修改(添加、删除)不算做修改
const TEAM = ["hello","world"];
TEAM.push("java");
console.log(TEAM); //[ 'hello', 'world', 'java' ]

原理是:这里变量存的是地址,改变地址中存的元素不会改变地址。但如果保存的值整体发生改变就会报错。例如重新赋值TEAM=100;报错:TypeError: Assignment to constant variable.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值