初学者跪着学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大全


<<:  Day-8 Divide-and-Conquer-3 : 二分搜寻法, 费波那契数列, Strassen’s演算法

>>:  Day4. 其实一切东西都在那,只是少了渲染 - Render

0 day 安全笔记 第二章 基本知识 下

OS:XP SP3 编译器: DEV C++ 4.9.9.2 工具: OD (ollydbg) 大家...

第4天~点餐系统

2022/1/19再练习一次: 改最上面标题的地方: 使用按钮ToggleButton和Switch...

【Day04】数据输入元件 - Checkbox

元件介绍 Checkbox 是一个多选框元件。通常使用情境是在一个群组的选项当中进行多项选择时使用。...

Day 3 : 建立Python开发环境吧(Linux)!

现在越来越多人使用Linux系统,所以今天会来介绍一下在Linux上使用终端机安装Python的方法...

JS 23 - 非同步执行,也是要依序排队!

大家好! 今天我们要实作的静态函式有点像 Promise 的感觉。 我们进入今天的主题吧! 程序码 ...