广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中let与const命令使用
  • 686
分享到

JavaScript中let与const命令使用

2024-04-02 19:04:59 686人浏览 安东尼
摘要

目录let命令基本使用适用场景块级作用域概念存在意义const命令基本使用不可被const的情况let命令 基本使用 let是es6中新增的声明变量的命令,但是和var不同,let不

let命令

基本使用

letes6中新增的声明变量的命令,但是和var不同let不可以被重复声明let只在其命令的代码块有效let禁止变量出现变量提升现象,let会通过暂时性死区的方式来避免程序上的错误

  • 代码块:使用{}包括起来的内容

  • 声明变量:分配一个存储空间

  • 不可重复声明let声明过后的变量无法再再次声明,而var可以重复声明

    {
        let a = 10;
        var a = 1; // 'a' has already been declared
    }
    {
        var a = 10
        var a = 1
    }
    console.log(a) // 1
  • 不同代码块可被重复声明:值得注意的是let的不可重复声明是作用在同一代码块中的,后面将会具体解释相关的概念即块级作用域

    {
      let a = 1
      console.log(a)
    }
    {
      let a = 2
      console.log(a)
    }
  • 有效区间的不同let只在其命令的代码块内有效,而var声明的变量可全局有效,下面例子说明两者不同。

    {
        let a = 10;
        var b = 1;
    }
    console.log(a) // a is not defined
    console.log(b) // 1
  • 变量提升:之前使用var声明变量,在声明前调用为undefinedundefined就是我们熟悉的声明但未赋值,这种现象叫做变量提升,但是let禁止了这一行为,使用let所声明的变量一定需要在声明后使用。

    console.log(bar) // Cannot access 'bar' before initialization
    let bar = 2 
  • 变量提升的编译:我们分别来看下变量提升现象在编译后的情况,就能彻底理解变量提升现象出现的原因,所有的声明变量语句在编译后都会将声明语句提到程序的最先级,所以才会出现声明但未赋值的现象。

    // 编译前
    console.log(a)
    var a = '猪痞恶霸'
    // 编译后
    var a 
    console.log(a)
    a = '猪痞恶霸'
  • 暂时性死区:在代码块中使用let声明变量前,该变量不可用,这种现象称为暂时性死区,其实这点和变量提升有些相似,我理解为:let禁止变量提升现象的原因是在声明变量前的代码区域为暂时性死区

    {
        // 暂时性死区
        tmp = 'abc';
        console.log(tmp)
        // 暂时性死区
        let tmp; // 声明tmp,结束暂时性死区
        console.log(tmp) // undefined 声明未赋值
        tmp = '123'
        console.log(tmp) // 123
    }
  • 隐蔽的死区:有些暂时性死区会在我们注意不到的地方,比如

    function bar(x = y, y = 2) { 
        return [x,y]
    }
    bar() // Cannot access 'y' before initialization
    bar(2) // 无错误

    由于x的默认值为y,且y的声明还没开始,所以x = y处于死区中

适用场景

letvar根据其各自不同的特点有着不同的适用场景

  • 计数器的使用:如果我们需要一个用来计数的变量,那么我们就可以使用let来声明。

    var arr = []
    for(let i = 0; i < 10; i++) {
        arr[i] = () => {
            console.log(i)
        } // 利用计数进行操作
    }
    arr[7]() // 7
    for(var i = 0; i < 10; i++) {
        arr[i] = () => {
            console.log(i)
        } // 利用计数进行操作
    }
    arr[7]() // 10

    根据适用varlet的输出结果就能清楚两者的适用场景,而这也凸显了let声明变量的不同之处,即声明的有效区间不同

  • for循环中的父子关系:for循环中有两个作用域,即父作用域与子作用域,设置循环变量的部分为父作用域,循环体内部为子作用域

    for(let i = 0; i < 3; i++) {
        let i = 'abc';
        console.log(i) 
    }
    // abc
    // abc
    // abc

    上面的例子循环打出了三个abc就说明了两个i的作用域不同,如果不在循环体内声明的话将会打印出0,1,2

块级作用域

ES6新增了块级作用域,此前ES5只有全局作用域函数作用域

  • 全局作用域:拥有全局作用域的变量可以在程序的任意位置访问,而window对象的所有属性都具有全局作用域。
  • 函数作用域:又被称为局部作用域,每一个函数中都有一个函数作用域或者嵌套更多的函数作用域,在函数作用域中定义的变量只能在该函数作用域内部使用。

概念

块级作用域的出现其实是由新增声明let产生的

let n = 5
function fn() {
    if(true) {
        let n = 10
    }
    console.log(n)
}
fn() // 5

上面的例子诠释了块级作用域的作用,即外层代码块不受内层代码块的影响,我们在if函数体内声明的n只有在if函数体内可以访问,而fn中访问n不受if内层的声明影响。

存在意义

var tmp = new Date();
function fn() {
    console.log(tmp);
    if(false) {
        var tmp = 'hello world'
    }
}
fn()

如上,存在函数作用域全局作用域,正常情况下fn()函数体内if函数体外是使用外层即var tmp = new Date();但是由于变量提升现象的存在即if函数体内的var tmp = 'hello world'发生了变量提升,即fn()函数体内的编译形式如下,所以输出结果为undefined

function fn() {
    var tmp
    console.log(tmp);
    tmp = 'hello world'
}

块级作用域正是解决了这个问题

let n = 5
function fn() {
    if(true) {
        let n = 10
    }
    console.log(n)
}
fn() // 5

除此之外还可以防止局部作用域变量的泄露到全局当中

let arr = [1,2,3]
for(var i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
{
  console.log(i) // 3
}

如上就造成了变量泄露,i变量被泄露到了全局当中,那么我们使用块级作用域来看一看i is not defined,说明变量未被泄露到全局中。

let arr = [1,2,3]
for(let i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
console.log(i) // i is not defined

const命令

基本使用

const声明的变量无法被再次赋值改变,且声明的时候必须赋值

const name = '猪痞恶霸'
name = 'fzf404' // Assignment to constant variable.
const name // Missing initializer in const declaration
name = '猪痞恶霸'

constlet的特性很像,比如只在其声明的块级作用域内有效,存在暂时性死区

不可被const的情况

javascript中有两种数据类型即:简单数据类型复杂数据类型

简单数据类型:数值,字符串,布尔值

复杂数据类型数组,对象

引出数据类型的原因正是因为两种数据类型的访问方式不同,简单数据类型的值直接保存变量所指向的内存地址,直接访问就可以拿到值而复杂数据类型的访问是通过变量指向的内存地址,内存地址保存的是另一个指针(引用)

const声明是通过保证变量所指向的那个内存地址不能改动,所有说使用const声明复杂数据类型,会出现数组的元素和对象的属性可以发生改变

const person = {}
person.name = "猪痞恶霸"
console.log(person.name) // 猪痞恶霸

如果我们想要使我们的对象不可以发生改变那么我们可以使用Object.freeze方法,详细使用参考这篇文章:冻结js对象方法技术详解

到此这篇关于JavaScript中let与const命令使用的文章就介绍到这了,更多相关JavaScript let与const命令内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript中let与const命令使用

本文链接: https://www.lsjlt.com/news/154269.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中let与const命令使用
    目录let命令基本使用适用场景块级作用域概念存在意义const命令基本使用不可被const的情况let命令 基本使用 let是ES6中新增的声明变量的命令,但是和var不同,let不...
    99+
    2022-11-13
  • javascript的let和const命令怎么使用
    本篇内容介绍了“javascript的let和const命令怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!let命令基本用法我们都知...
    99+
    2023-07-02
  • ES6中let和const命令有什么用
    这篇文章将为大家详细讲解有关ES6中let和const命令有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在javascript中,我们都知道使用var来声明变...
    99+
    2022-10-19
  • ES6的let和const命令怎么用
    今天小编给大家分享一下ES6的let和const命令怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. let 命令①...
    99+
    2023-06-17
  • javascript中var与let、const的区别详解
    一、var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100; console.log(a,window.a); // 100 10...
    99+
    2022-12-23
    javascript中var与let const的区别详解 var let const区别
  • JavaScript ES的let与const关键字怎么使用
    这篇文章主要讲解了“JavaScript ES的let与const关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript ES的let与cons...
    99+
    2023-06-21
  • Javascript 中 var 和 let 、const 的区别及使用方法
    目录1.var、let、const简介var 声明let 声明const 声明 总结1.var、let、const简介     &n...
    99+
    2023-01-13
    js中var和 let  const 区别 js中var和 let  const 使用
  • JavaScript中var let const的用法有哪些区别
    目录1.重复声明1.1 var1.2 let1.3 const2.变量提升2.1 var2.2 let2.3 const3.暂时性死区3.1 var3.2 let3.3 conset...
    99+
    2022-11-12
  • tar命令与rpm命令怎么在linux中使用
    tar命令与rpm命令怎么在linux中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一. tar  1.压缩一组文件为tar.gz后缀。  # tar...
    99+
    2023-06-13
  • Linux的chattr命令与lsattr命令如何使用
    本篇内容主要讲解“Linux的chattr命令与lsattr命令如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的chattr命令与lsattr命令如何使用”吧!chattr &...
    99+
    2023-07-06
  • Shell中set与shopt命令如何使用
    Shell中set与shopt命令如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。set命令选项set命令作用主要是显示系统中已经存在的shell变量,以及设置shell...
    99+
    2023-06-09
  • diff与comm命令怎么在linux中使用
    diff与comm命令怎么在linux中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。代码调用...
    99+
    2023-06-13
  • Linux中rev与tac命令的使用方法
    这篇文章主要讲解了“Linux中rev与tac命令的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中rev与tac命令的使用方法”吧!revrev 显示最后一个字符显示到第...
    99+
    2023-06-12
  • Linux系统中grep与fgrep命令的使用
    这篇文章主要介绍“Linux系统中grep与fgrep命令的使用”,在日常操作中,相信很多人在Linux系统中grep与fgrep命令的使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统中gre...
    99+
    2023-06-12
  • Linux系统中rpm与yum命令的使用
    本篇内容介绍了“Linux系统中rpm与yum命令的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!rpmrpm是一个功能十分强大的软件包...
    99+
    2023-06-10
  • Linux中的export与alias命令怎么使用
    这篇文章主要讲解了“Linux中的export与alias命令怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中的export与alias命令怎么使用”吧!摘要:export...
    99+
    2023-07-05
  • Mysql Explain命令的使用与分析
    mysql explain命令用于显示mysql如何使用索引来处理select语句以及连接表。通过该命令可以分析出查询语句或是表结构的性能瓶颈,从而写出性能更好的SQL语句,通过 expalin 命令我们可...
    99+
    2022-10-18
  • 如何安装与使用yum命令
    如何安装与使用yum命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。yum安装常用软件的命令#yum check-update#yum remove 软件包名#yum i...
    99+
    2023-06-10
  • Linux中rm与rmdir删除命令如何使用
    今天就跟大家聊聊有关Linux中rm与rmdir删除命令如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。rm命令用法:rm [选项]... 文件...删除 (unlink) 文...
    99+
    2023-06-12
  • javascript中使用let声明变量的优势有哪些
    这篇文章主要介绍了javascript中使用let声明变量的优势有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript中使用let声明变量的优势有哪些文章都会...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作