iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
Modern Web

初學者跪著學JavaScript系列 第 4

初學者跪著學JavaScript Day4 : 宣告:let、const

一日客家話:空心菜(客)風吹:vung coi
ES6 之前沒有 block 作用域概念是使用var,會造成區塊變數蓋全域變數

把 var 改成 let,在執行第二句時就會報錯

let apple = 10;
let apple = 11;//報錯SyntaxError: Identifier 'apple' has already been declared
let apple = 12;
console.log(apple);

let

  • 宣告變數可以不加初始值,但變數值是undefined
    let a;

  • 一個let 宣告多個變數和值

let a = 10,
    b = 20,
    c = 30;
console.log(a, b, c);
  • scope(作用域)是區塊{ },所以柵欄是{ },出了區塊變數無法識別到
function mylet() {
    {
        let x = 2;
        console.log(x);//2
    }
    console.log(x);//Error: x is not defined
}
mylet();
  • 變數:可以重新指定值

使用let宣告 a變數值是10,下一句再對a變數重新給值5,是不會報錯的

let a = 10;
a = 5;
console.log(a);

const

  • scope:是區塊{ }

  • 不能重新指定值
    使用const 宣告a變數是,下一句再對a變數重新給值5但會報錯!!

const a = 10;
a = 5;//會報錯TypeError: Assignment to constant variable.
console.log(a);
function myConst() {
    const x = 10;
    {
        const x = 2;
        console.log(x);//2
    }
    console.log(x);//10
}
myConst();
  • 整理:const 和 let Scope都是以{ }區塊內作用
    差別:
    const 不能重新賦值
    let 可以重新賦值

stackoverflow:Why can I change a constant object in javascript

const 遇到non primitive:物件

non primitive 和 primitive 是哪些?下一篇會說

之前不懂書特別介紹哪些是 non primitive 和 primitive,在找資料時才發現原來和記憶體位置有些關係

思考 : 為什麼物件和array使用const宣告,可以改變值 ???

使用陣列:

新增元素值

const footer = ['apple', 'banana', 'water'];
footer.push('egg');
console.log(footer);
//[ 'apple', 'banana', 'water', 'egg' ]

但重新賦值,會報錯

const footer = ['apple', 'banana', 'water'];
footer = ['a', 'b'];

物件:

新增key和value值

const family = { dad: 'john', mom: 'amber' };
family['son'] = 'allen';
console.log(family);
//{ dad: 'john', mom: 'amber', son: 'allen' }

但重新賦值,會報錯

const family = { dad: 'john', mom: 'amber' };
family = { red: 'apple', yellow: 'banana' };//報錯
//Assignment to constant variable.

大部分是建議盡量使用const宣告若值會改變就用let宣告

到底真正改變的意思是什麼?

例如:

數字是固定不變值,使用const宣告,但 array 也不想改變使用 const 宣告可是值可以允許改變

why?

會改變其實是指可以改變記憶體位置

const 不能改變stack 裡的memory address

let 宣告

let a = 5;
a = 500;
console.log(a);


記憶體位址值不是正確寫法

const 宣告

const a = 5;
a = 500;
console.log(a);

使用 const 宣告,值是 array,把值加到 array 內試試 push

不會報錯~

const fruit = [];
fruit.push('apple');
fruit.push('banana');
console.log(fruit);//['apple','banana']

原因

當物件時:stack 的 value 存的是記憶體位置,push 的值是到 heap 裡

有符合記憶體位置沒有改變,所以就算 const 宣告也不會報錯!

重新賦予一個 array


const fruit = [];
fruit.push('apple');
fruit.push('banana');
fruit = ['orange'];

['orange']是新的Array會創新的記憶體空間,會指向它

但就會改變stack 裡的memory address

就會報錯啦

資料來源:
JavaScript’s Memory Model

JavaScript大全


上一篇
初學者跪著學JavaScript Day3 : 變數Variable、宣吿var
下一篇
初學者跪著學JavaScript Day5 : 資料型別:Primitive values 和 Non-primitive values
系列文
初學者跪著學JavaScript30

1 則留言

0
南國ㄟ安迪
iT邦新手 5 級 ‧ 2021-09-19 14:39:46

let,const 我都略懂
但結尾的圖可以多說明一下嗎 /images/emoticon/emoticon10.gif

wendy iT邦新手 5 級 ‧ 2021-09-21 14:15:46 檢舉

只可意會,不可言傳

我要留言

立即登入留言