es6学习(一):变量声明的方式对比:var,let,const

news/2024/7/10 22:51:53 标签: es6, javascript, 前端

前言

在let和const出现之前,js可以使用var为变量命令,如果是函数也可以用function命名,甚至你可以直接不用任何关键字命名

javascript">        var a = 1
        function fn() { }
        b = 2

        console.log(a)
        console.log(fn)
        console.log(b)

结果如下

var的特性

1.window环境下,var在最外层定义的变量会直接赋值给window

javascript">        var abc = '哈哈哈'
        console.log(window.abc,'var之后我在window上')

2.可以重复命名

javascript">        var abc = null
        console.log(abc,'赋值为null')
        var abc = 111
        console.log(window.abc,'赋值数字')

3.会变量提升

javascript">        console.log(abc,'赋值之前')
        var abc = '初始化数据'
        console.log(abc,'赋值以后')

4.可以先声明再赋值

javascript">        var abc
        console.log(abc,'声明')
        abc = 'wjt'
        console.log(abc,'赋值')

 

5.可以使用单变量模式

javascript">        var a ,b ,c
        a = 1
        b = 2
        c = 3

let的特性

1.不会变量提升

javascript">        console.log(abc)
        let abc = 'wjt'

这句话的翻译是:初始化之前无法访问'abc'

2.不可以重复命名

javascript">        let abc = 1
        let abc = 2

这句话的翻译是:'abc'已被声明

3.可以先声明再赋值

javascript">        let abc
        console.log(abc,'声明')
        abc = 'wjt'
        console.log(abc,'赋值')

 

4.可以使用单变量模式 

javascript">         let a,b,c
         console.log(a,b,c,'单变量')

 

const的特性

1.不会变量提升

和let一样,这里不展示了

2.不可以重复命名

和let一样,这里不展示了

3.不可以修改值

基础类型
javascript">        const abc = 'wjt'
        abc = 'Wjt'
        console.log(abc)

 这句话的翻译是:对常量变量赋值。

引用类型
javascript">        const arr = [1,2,3]
        arr = [2,3,4]

        const obj = {name:'wjt'}
        obj = {name:'Wjt'}

但是,我们可以修改引用类型内部的属性,因为引用类型赋值的是一个内存地址,你修改地址值会报错,但是修改内存地址里的属性不会报错,如下

javascript">        const arr = [1,2,3]
        arr.push(4)

        const obj = {name:'wjt'}
        obj.name = 'Wjt'
        console.log(arr,obj)

 

4.不可以只声明不赋值

javascript">const abc

 

 这句话的翻译是:在const声明中缺少初始化式

5.不可以使用单变量模式

 面试

1.var let const的区别

var=>let和const

1.var有声明提升,而let和const没有

2.var在作用域内没有暂时性死区,let和const有

3.var可以对变量进行重复声明,let和const不行

4.window环境中,var在最外层定义的值会赋值给window,let和const不会

5.var没有块级作用域,let和const有块级作用域

var和let=>const

1.var和let声明的变量可以修改值,const一般声明常量,值不可以修改

2.var和let都可以先声明,再赋值,const不行

3.var和let都可以使用单变量模式,const不行

let=>const

let声明的是变量值,const声明的一般为常量值

2.经典循环中对比var和let

普通循环
javascript">        for(var a = 0;a<3;a++){
            console.log(a,'常规for循环var定义')
        }
        for(let b = 0;b<3;b++){
            console.log(b,'常规for循环let定义')
        }
        for(const c = 0;c<3;c++){
            console.log(c,'常规for循环const定义')
        }

var和let可以正常输出,变量值也可以被正常增加,const就不行,因为const是不可以修改的

循环加定时器
javascript">        for(var a = 0;a<3;a++){
            setTimeout(()=>{
                console.log(a,'循环定时器var定义')
            })
          
        }
        for(let b = 0;b<3;b++){
            setTimeout(()=>{
                console.log(b,'循环定时器let定义')
            })
        }

那是因为var没有块级作用域,循环是同步任务,循环执行完了才开始执行定时器,这个时候a早已经被改成3了,所以每次输出都是3

let有块级作用域,每次执行完毕,for内部的b都会被保存一份,所以每次循环完毕之后的值我们都能输出出来。

javascript">        for(var a = 0;a<3;a++){
            console.log(a,'我不在定时器内')
            setTimeout(()=>{
                console.log(a,'循环定时器var定义')
            })
        }

javascript">        for(let b = 0;b<3;b++){
            console.log(b,'我不在定时器内')
            setTimeout(()=>{
                console.log(b,'循环定时器let定义')
            })
        }

什么是块级作用域?答曰:大括号就代表一层块级作用域(这么描述不是特别准确,有些大括号就不是(比如对象的大括号),作用域内会说,这里不陈述)

3.js中声明变量的方式(7种)

1.啥关键也不用,例如直接a=1

2.var声明

3.let声明

4.const声明

5.function声明函数

6.class声明类

7.import声明,例如import data from './data.js'


http://www.niftyadmin.cn/n/5261145.html

相关文章

【Python测试开发】文件上传操作

先写一个上传页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文件上传</title><link href"http://dcn.bootcss/bootstrap/3.3.0/css/bootstrap.min.css" rel"styleshee…

数字开关:晶体管饱和和强制 Beta

内附链接 1、USB转SPI_I2C适配器(专业版); 晶体管通常用作数字电路中的受控开关。例如&#xff0c;晶体管可以用作缓冲器&#xff0c;允许微控制器激活继电器或LED。对于这些数字应用&#xff0c;我们希望晶体管饱和&#xff0c;以便集电极到发射极出现短路&#xff1b;就像闭合…

【专栏目录】

摘要 本专栏是讲解如何改进RT-DETR的专栏。改进方法采用了最新的论文提到的方法。改进的方法包括&#xff1a;增加注意力机制、更换卷积、更换block、更换backbone、更换head、更换优化器等&#xff1b;每篇文章提供了一种到N种改进方法。 评测用的数据集是我自己标注的数据集…

编码遗传学:JavaScript 继承之道

引入 JavaScript中的继承问题是一个很重要的知识点&#xff0c;很多面试都会问到。本文主要来详细地讲解JavaScript实现继承的不同方法。其中包括原型链继承、构造函数基础、组合式继承以及寄生组合式继承等ES5的实现方式&#xff0c;也会介绍ES6新出现的class继承。 原型链继…

第六章--- 实现微服务:匹配系统(中)

完善上一part的匹配系统 对于之前的优化 由于要区分玩家&#xff0c;所以要在之前Game.java添加一个Player类存储玩家信息, 包括&#xff1a; 玩家Id&#xff0c; 玩家起始位置(sx,sy) 记录每个玩家走过的路径steps&#xff0c;即每个玩家历史上执行过的操作序列&#xff0c;…

windows redis 允许远程访问配置

安装好windows版本的redis&#xff0c;会以服务方式启动&#xff0c;但是不能远程访问&#xff0c;这个时候需要修改配置。redis安装路径下会有2个配置文件&#xff0c;究竟需要怎么修改才能生效呢&#xff1f;看下图 这里的redis服务指定了是redis.windows-service.conf文件&…

使用Log4j与log4j2配置mybatisplus打印sql日志

环境&#xff1a;项目非完全spring项目&#xff0c;没有spring的配置文件。执行sql时老是不打印sql语句。因此进行修改&#xff0c;过程比较坎坷&#xff0c;记录一下。 我尝试使用log4j和log4j2进行配置 最终把这两种全部配置记录上 Log4j配置 如果项目用的是log4j需要进行配置…

PHPstudy小皮的数据库打开失败问题解决

如果你的MYSQL服务启动后停止&#xff0c;多次重启依然无法解决的情况下&#xff0c;大概率是和本地mysql冲突了 但是&#xff0c;千万不要卸载掉本地mysql&#xff0c;只需要在服务中停止本地mysql即可 将此服务关闭&#xff0c;小皮的mysql即可使用