在js中,定义变量时要使用var操作符,但是var有许多的缺点,如:一个变量可以重复声明、没有块级作用域、不能限制修改等。

//缺点1:变量可以重复声明
var a=1;
var a=2;
console.log(a); //2
//缺点2:无法限制修改
//缺点3:没有块级作用域
{
var b=12;
}
console.log(b); //12

ES6新增的let和const就解决了这些问题。下面我们来看看let和const吧。

  1. let和const都不能重复声明

    let a=1;
    let a=2;
    console.log(b); //SyntaxError: Identifier 'a' has already been declared
  2. let声明的是变量,值可以修改;const声明的是常量,不能修改
    const a=1;
    a=2;
    console.log(a); //TypeError: Assignment to constant variable.
  3. 有块级作用域
    var a=[];
    for(var i=0; i<5;i++){
    a[i] = function (){
    console.log(i);
    }
    }
    a[2](); //5

    上面这个例子中,变量i是var定义的,作用域是在全局,全局只有一个i,每一次循环,变量i的值都会+1,循环结束后,i的值为5。所有数组a的成员,a[0]...a[4]里面的i都是同一个,所以最后输出的是5。

    let a=[];
    for(let i=0; i<5;i++){
    a[i] = function (){
    console.log(i);
    }
    }
    a[2](); //2

    上例中,i是用let声明的,仅在块级作用域有效。数组a的每一个成员都有一个自己的 i,所以最后输出的是2。
    另外,值得注意的是,for循环设置循环变量的那部分是父作用域,循环体内是单独的子作用域。如下例。

    for(let i=0; i<2; i++){
    let i=12;
    console.log(i);
    }
    //12
    //12
  4. 不存在变量提升
    console.log(a); //undefined
    var a = 1; console.log(b); //ReferenceError: b is not defined
    let b = 2;

    var命令会出现变量提升的现象,即可以在声明之前使用变量,值为undefined。let 则不行,变量必须要在声明之后才能使用,否则就会向上例一样报错。

  5. const的本质
    const并不是保证变量的值不能改变,而是变量指向的内存地址里面保存的数据不能发生改变。对于基本数据类型的数据,变量指向的内存地址中就直接保存它的值;对于复合类型的数据,如数组和对象,变量指向的内存地址中保存着的是一个指向实际数据的指针。
    const a = 12; //变量a指向的内存地址中存放着数字12
    //person指向的内存地址中存放着的是对象的地址,const只能保证存着的这个对象地址不变,
    //但对象本身是可变的,可以修改属性等 const person = {
    name: 'lisi',
    age: 18
    }
    person.age = 19;
    console.log(person.age); //19
    person = {}; //TypeError: Assignment to constant variable.
  6. 顶层对象的属性
    顶层对象在浏览器环境下指的是window对象。
    var a = 1;
    console.log(window.a); //1
    let b = 2;
    console.log(window.b); //undefined

    var和function声明的全局变量,依旧是window对象的属性,let和const、class声明的全局变量,不属于window对象的属性。

ES6学习笔记之 let与const的更多相关文章

  1. ES6学习笔记(一)——let和const

    1.ES6学习之let.const (1).var.let.const 变(常)量声明 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 在ES6中let就诞生了,实际上它 ...

  2. es6学习笔记1 --let以及const

    let语句的基本用法:  1.let声明的变量为块级作用域,只在最近的{}里面有效,如果在外部引用就会报错. { let a = 10; var b = "hello" } ale ...

  3. ES6学习笔记(1)----let和const命令

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ let和const命令 let 总结1.声明变量基本使用方法与var 相同  不同点  a.在代 ...

  4. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  5. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  8. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  9. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

随机推荐

  1. buaaoo_third_assignment

    你看这个代码它又长又宽 一.JML (1)理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言 (Behavi ...

  2. 『动善时』JMeter基础 — 14、使用JMeter发送Post请求

    目录 1.Post请求参数类型说明 2.用于演示的项目说明 3.发送Post请求示例 (1)测试计划内包含的元件 (2)请求参数类型为x-www-form-urlencoded 4.请求参数form- ...

  3. Mybatis-plus在原有的select查询语句中动态追加查询条件

    一.适用场景 1.使用了xml形式的mapper.2.不想在select查询中大量使用<if>标签来判断条件是否存在而加入条件. 二.步骤 1.自定义wrapper继承QueryWrapp ...

  4. golang:函数总结

    golang保留的函数 init(), main()是golang的保留函数,有如下特点: main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个 两 ...

  5. [bug] C++:[Error] name lookup of 'i' changed for ISO '

    错误原因:变量i只在for循环中可见,若在循环外使用需要单独定义 1 #include <iostream> 2 using namespace std; 3 4 int main(){ ...

  6. 面试阿里P6难在哪?(面试难点)

    对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿 ...

  7. Linux下Firefox打开文件jnlp文件

    ubuntu(linux)打开jnlp文件 咘咘 2019-05-20 15:12:48 1331 收藏展开 前提条件是安装有java环境.whereis java 查看自己java安装目录.本人是在 ...

  8. Python菜鸟100例

    题目地址 #-*- codeing = utf-8 -*- #@Time : 2021/3/18 21:17 #@Author : HUGBOY #@File : 1.py #@Software: P ...

  9. mysql基础之mariadb的安装,连接,用户,密码,权限设置语句详解

    一.mariadb安装 1.配置mariadb源: [root@ren7 ~]# vim /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB ...

  10. Docker 的神秘世界

    引言 上图就是 Docker 网站的首页,看了这简短的解释,相信你还是不知道它是何方神圣. 讲个故事 为了更好的理解 Docker 是什么,先来讲个故事: 我需要盖一个房子,于是我搬石头.砍木头.画图 ...