这是第一次在公开的地方撰写 JavaScript 相关的技术文章,若有错误或需要补充的地方,也欢迎在下方留言让我知道喔~~~谢谢大家!!
在 ES6 出现了 let、const 宣告变数的关键字。它们究竟和 var 所宣告得变数有何不同呢?继续看下去吧....
在过去使用 var 宣告变数时,如果有不小心重复宣告到相同的变数名称时,不仅不会有任何问题,後面的值还会覆盖掉一开始所赋予的值。
var myName = '大明';
var myName = '小明';
console.log(myName); //小明
因为在开发的过程中,我们不是刻意的要去宣告相同的变数名称,也不是刻意要去覆盖掉原有的值。
当然程序码如果少少的,马上发现也很好处理,但如果程序码一多,要维护或是除错,基本上就会不太好查找。
var myName = '大明';
let myName = '小明';
Uncaught SyntaxError: Identifier 'myName' has already been declared
马上就会跳出错误讯息,告诉你 myName
这个变数已经使用过了。
以往使用 var 宣告的变数,会被挂载在 window 底下,也就是全域环境底下。但变数都散落在全域环境底下不是一件好事;而 var 宣告的变数是以 function 来区分作用域的,也因此有了全域变数
和区域变数
的概念。
那我们来看一段程序码,
for (var i = 0; i<10; i++) {
console.log(i); // 0,1,2,3,4,5,6,7,8,9
}
console.log(i); // 10
for (let k = 0; k < 10; k++) {
console.log(k); // 0,1,2,3,4,5,6,7,8,9
}
console.log(k); // Uncaught ReferenceError: k is not defined
从上述程序码可以发现,变数 i
在全域环境下还可以取得i
的值;而变数 k
则是跳脱出for回圈之後就无法取得该值。
因为 let 的作用域是在block
,block
是指 {}
符号,有人称它花刮号,我是习惯叫它大括号。因此跳出了for回圈的{}
之後就无法取得k
的值。这就是区域作用域的概念。不只是 let
有这样的概念,const
也是如此。
const 宣告一个常数,简单来说,就是宣告了就无法再被修改的意思。
const myName = 'Afat';
myName = '臭阿肥';
console.log(myName); //Uncaught TypeError: Assignment to constant variable.
一旦修改了myName
的值,就会跳出错误,告诉你不可以修改const
所宣告的值。
过去变数可以先宣告(宣告变数未赋予值会是 undefined)但使用const宣告,就一定要赋予值。
const aFat;
//Uncaught SyntaxError: Missing initializer in const declaration
使用 const 宣告的物件,内层属性依然可以调整,因为物件是传参考,所以在此依然可以修改属性。
const classroom = {
teacher: '王老师',
classmateA: '同学A',
classmateB: '同学B'
};
classroom.classmateC = '同学C';
console.log(classroom);
使用console.log查看classroom,就会得到以下的结果。
{
classmateA: "同学A"
classmateB: "同学B"
classmateC: "同学C"
teacher: "王老师"
}
这是因为物件依然是维持传参考的特性。
以往我们使用var宣告变数时,会出现Hoisting
的状态,因此若我们在创造阶段取得变数时,会出现undefined。
console.log(myName); //undefined
var myName = '阿肥';
那麽let呢?
{
console.log(myName);
//Uncaught ReferenceError: Cannot access 'myName' before initialization
let myName = '臭阿肥';
}
let
一样会有创造阶段,但是从创造阶段到实际宣告阶段会出现暂时性死区TDZ,而在暂时性死区是无法呼叫到该变数的。有创造到执行的概念,但是不会预先出现undefined
,而是会直接出现错误提示。
以上是今天的var、let、const的差异,如果我有写错或是有需要补充的,都欢迎大家跟我说喔~
如果觉得我写得不错,很清楚的话也欢迎让我知道喔~
谢谢大家观看
<<: 【Vue】建立 第一个 component | 专案实作
清单设计 我们先将清单分成多个不同小块来设计,最後再将它们组起来 清单架构 <ul class...
每年的 IT Home 铁人赛,总是吸引着许多人的朝圣,不意外,今年也会是参加者【众多】。 但可惜...
目录 JavaScript Day01 - 说明 说明与工具 JavaScript Day02 - ...
透过 x-data 宣告一个 Alpine 元件後就可以来操作里面的内容啦!今天会大略介绍一些比较常...
什麽是挖矿?需要准备铁镐吗? 说到挖矿,可能很多人会想到的是显卡的涨价,让大家都觉得挖矿就是用显卡来...