iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
2

在ES6 中,提供了let 與 const 讓我們使用

let

可以不用給初始值

let 在宣告的時候可以不用給值
若無初始值
預設會給undefine,這點跟var 很像
與var 最大的不同是,用這種宣告方式並不會hoisting

也就是必須宣告了才能使用

這就讓人舒服多了不是!!!!

不可重複宣告

這點在var 已經搞死我們了
但是在let 中嚴格規定不可以重複宣告
不信可以試試。

let abcd;
let abcd;

...不過我這麼好心還是來試一下
有圖有真相,是吧!
您給矁矁
https://ithelp.ithome.com.tw/upload/images/20181002/20110579vekhoLlFl2.png

區塊作用域{}

而且在{} 包起的塊級作用域中,確確實實的只活在這個小圈子裡

{
	var b="我是b";	
	let a="我是a";
	
}

console.log("var in scope: ",b);
console.log("let in scope: ",a);

VM443:7 var in scope:  我是b

這樣會發生什麼事呢?
如果外面叫得到let所宣告的 a呢.......
那我們要他做啥!
當然,一定要是叫不到的!
那我們來跑跑看
順便看看var 有什麼樣的表現
https://ithelp.ithome.com.tw/upload/images/20181002/20110579nPYQUNWoG2.png

非.常.好

用var 宣告的,果然又漏出來了!
但是用let宣告的 ,果然一滴都不外漏!

再來看看昨天讓我們困擾的for迴圈變數泄漏的例子

用let 的表現怎麼樣呢?

for(let i=0;i<10;i++){}
console.log(i);

100分! 果然不外漏
https://ithelp.ithome.com.tw/upload/images/20181002/20110579s4U90cFbsd.png

直接存取到內層變數,始終是一件不太舒服的事情是吧!

const

const(常數)

常數一定得賦值

既然是一個常數,總不能不給值吧
所以用const 宣告變數時,一定要給初始值
否則js 會認為程式有錯
https://ithelp.ithome.com.tw/upload/images/20181002/20110579T4Cfq3AR8f.png

常數不可重複賦值

既然是常數,就代表了不可改變(物件的狀況另外討論)
所以若是重複賦值可是會出錯的!
https://ithelp.ithome.com.tw/upload/images/20181002/20110579gN0Juiw6lK.png

作用域

這邊const 與let 都一樣遵守區域作用域

{
    const abcdefg=10;
    console.log("abcdefg in the house",abcdefg);
}
console.log("abcdefg 出來吧!",abcdefg);

以上想當然爾只有in the house 才會refer得到abcdefg 這個常數
啥你還不相信吶,覺得常數像像麥當勞一樣哪邊都能叫得到!?
https://ithelp.ithome.com.tw/upload/images/20181002/20110579AkjqYjTi2s.png

const 一個物件

這邊就可以修改用const 宣告物件中的值
嗯。


....不是說不能修改常數的值嗎?
這邊為啥又可以!!
呃 我是說 不能重複賦值
要是修改物件的屬性,還是可以的 哈哈哈...

這還是有點超乎想像
我們來看一下例子

const iamObject={
a:123,
b:"hi"


}
iamObject.a=456;
iamObject.b=888;

果然可以更改屬性值欸
https://ithelp.ithome.com.tw/upload/images/20181002/20110579gCtyFYakwl.png

但要是針對const 的物件重複賦值就錯了哦
https://ithelp.ithome.com.tw/upload/images/20181002/20110579PlCLBxYGos.png

如此~

但我們真的要做到讓物件像常數一樣,不能更改的話怎麼做呢

Object身上有提供一個 freeze() function

可以讓我們的物件上的屬性的更改無效
我們來實作看看

const iamObject=Object.freeze({
    a:123,
    b:"hi"
});
iamObject.a=456;
console.log(iamObject);

https://ithelp.ithome.com.tw/upload/images/20181020/20110579HWA2831ucR.png

可以看到雖然我們給物件的屬性賦值,但並沒有生效

總結

  • 如果不會改變的值,也不希望改變的變數
    請用const
  • 如果要做常數物件(不可更改屬性的),請用Object.freeze(object)
    • 如果確定會改的,請用let
  • 考慮相容性的問題(IE),就用var ,但一定要小心作用域與拉昇的問題

上一篇
搞懂變數作用域
下一篇
javascript 一定得懂的物件概念(1)
系列文
一步一腳印-紮紮實實學es630

1 則留言

0
konekoya
iT邦新手 5 級 ‧ 2018-10-08 09:08:33

Let and const 也是會 hoisting 喔
https://stackoverflow.com/a/31222689/1727948

感謝大大,我看看來修正一下!!

我要留言

立即登入留言