一日客家話:空心菜(客)風吹: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);
宣告變數可以不加初始值,但變數值是undefinedlet a;
一個let 宣告多個變數和值
let a = 10,
b = 20,
c = 30;
console.log(a, b, c);
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);
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();
stackoverflow:Why can I change a constant object in javascript
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'];
物件:
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 a = 5;
a = 500;
console.log(a);
記憶體位址值不是正確寫法
const a = 5;
a = 500;
console.log(a);
不會報錯~
const fruit = [];
fruit.push('apple');
fruit.push('banana');
console.log(fruit);//['apple','banana']
當物件時:stack 的 value 存的是記憶體位置,push 的值是到 heap 裡
有符合記憶體位置沒有改變,所以就算 const 宣告也不會報錯!
const fruit = [];
fruit.push('apple');
fruit.push('banana');
fruit = ['orange'];
['orange']是新的Array會創新的記憶體空間,會指向它
但就會改變stack 裡的memory address
就會報錯啦
資料來源:
JavaScript’s Memory Model
JavaScript大全