2021-05-04

在JS中如何正确使用变量声明符

JavaScript(下文都用简写JS替代)对于学前端的程序员来说,应该并不陌生,其中最具有特色之一的就是它的变量声明符(下文都用简写“声明符”替代),与类似于C/C++、C#等常用编程语言相比,JS的声明符,在声明变量时只要使用var声明符,就可替代(以C#为例)string、int等声明符。比如说我要在C#里面定义一个变量接收一个字符串,那我就要使用string声明符;接收一个整形,就要使用int声明符;但在JS中,无论接收的值是什么类型都是直接使用var声明符。尽管在JS中使用var声明符给程序员们带来更多的便利,那他们也应该接受JS相比其他类型语言比较独特的命名规则。下面一起来了解一下在JS中最主要的三个声明符:var、const、let及它们各自的一些特征和相比其他两种声明符自身的优势。

       第一个要讨论的声明符var,为什么var要第一个讲呢,因为在没有特定条件的情况下var的约束力在它们三个声明符之中是最小的,所以var理所当然也是众多程序员用的最多的(特殊情况除外)。使用var声明的变量,其作用域为该变量所在的函数内(每个变量都有它们作用域),比如下图,我在全局作用域中声明

了aaa,那此时aaa能被任何一个函数调用,且不需要声明;那么问题来了,为什么在316行中console.log(aaa)输出的是undefined呢,aaa不是在312行中被赋值为2了吗,那这就得回到前文对var作用域的解释。若在312行中只是单纯对变量aaa进行赋值操作(aaa=2;),那么315行aaa输出的就是2。但在上图中的312行有所不同,它在对aaa赋值的同时(前面加了个var)重新对aaa进行了变量声明,这时312行aaa变量的作用域的范围在yoyo()函数体内,就与310行的全局作用域中的aaa区别开来,一个为全局作用域的aaa和一个为函数yoyo()作用域的aaa。又回到之前的问题:315行的aaa为什么输出是undefined,因为console.log输出的是全局作用域中的aaa,全局作用域中的aaa并没有被赋值,所以为undefined。

       第二个const,相对var来说限制条件就比较多一点,它的声明的变量必须需赋值(数值、字符串、布尔值都可以,只要有值),因为const类型变量的定义是栈内存的值和地址不能再修改(相当于它的值不能被修改),所以second变量必须有值;

但若const声明的是对象,它的属性值可以被修改。在编写程序的过程中,如果考虑使用哪种变量会让代码运行质量更好,const类型变量应当为最优选,因为它所占用的内存是一个明确的区域,他不同于var、let可以只声明不赋值,生成一个抽象的内存区域,所以const类型变量会比较节省空间,从而提高代码运行质量。

       最后一个let,是在2015年推出的ES6向JS新添加的声明符,它也被众多程序员理解为更好的let。下图是分别用var和let写的计数a,b的循环;

控制台输出的结果:a输出了10个10,b输出了从0开始到9的10个数

因为b有自己的块级作用域,所以它在每个阶段都保留有唯一的值,而且let声明的变量不会变量提升(声明提升)。

       以上就是我的一些个人所识,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值