被第一人视角的我打断了对话,现在要继续讲完:
在D22的时候,我们知道了识别字、保留字,其中识别字缺少了宣告这件事仍可以赋值,但是它会被存於全域,易造成污染。
x1 = 2;
//window查找是否有这个属性
window.x1
所以宣告究竟能做到些什麽?
var
& let
& const
的差异在下面我会将宣告的差异分成两个面向来讲解:
在本日只会讨论 1. 宣告变数的可变性 的部分,那就开始吧!
不可变的const
用const
宣告的数值,不可重新赋值跟重新宣告。
const x = 2;
x = 1;
当你试着重新赋值时,就会显示上方的错误。
可变的let
,var
以var
或let
宣告的变数,其值可以视情况做修改;而宣告的部分:var
可重复宣告,let
不可重复宣告
var:
var x = 2;
var x = 1;
console.log(x);
let:
let y = 2;
let y = 1;
console.log(y);
让我们试着从记忆体的角度来看看吧?
首先,你知道变数也需要存放地方吗?那是在哪呢?!
以JavaScript来说分别就是:
1
,"字串"
等object
等。所以,当你每次宣告变数,并赋予基本型别值时,JS引擎其实在背後都会为变数新增记忆体空间。
例如当你宣告了一个变数为2
时,其实是:
let x = 2;//const or var 也是
而当你重新赋值时,实际正同时发生以下的事情:
let x = 2;
x = 1;
这时候实际上会再新建0x002的记忆体位置,并将1存入,接着x
转为指向0x002的记忆体位置。
let x = 2;
//把x值传给y
let y = x;
两个不同变数皆会指向相同记忆体位置。
x
的值时当x
将值赋予给别人後,将本身的值从2
改为1
时
let x = 2;
//把x值传给y
let y = x;
x = 1;
let
& const
不变与可变还记得上面讲到:用let
宣告的变数可修改,但const
则不行这件事吗?所谓的可变与不可变其实是指:记忆体位置
let
允许你修改记忆体位置,但const
则不行
我们先试着用const
再写一次同样的内容:
const x = 2;
x = 1;
前面提过 let
,const
两种宣告的值是否能修改,其实是跟记忆体位置有关,因此这时自然就会报错啦~
我们同样用const
宣告,这次要建立的是一个复合型别的空阵列
const x = [];
接着我们透过push
帮它新增值1
,2
,然後印出结果
x.push(1);
x.push(2);
console.log(x);
结果却没有报错,怎麽回事呢? 一样再从记忆体来看
当你宣告了一个空阵列时,其实是长这样的
const x = [];
此时,你在Call Stack储存的其实是Heap的记忆体位置,而不再是一个值。
所以当使用push
添加值却不会报错,是因为push
影响的是Heap。
x.push(1);
x.push(2);
所以当我们试着重新赋值[]
时就会报错啦~
const x = [];
x = [];
因为x = []
对於记忆体来说是其实会让callstack再新增一个记忆位置,并将x指向它,因此就会报错
从上面的示范,应该就能简单说明,为何同样以const
宣告,基本型别与复合型别却有不同的结果吧~
我:但这样还是没有解释到为何宣告能预防全域污染这件事啊...
方函式:别急,至少现在你能理解工具人与姐妹之间的差异是:~~
-- to be continued --
那今天就到这边搂!
每天的休息,是为了後面的追求,明天见。
大家好! 自从系列开始到昨天,也已经流逝 45 天的时间了。 这期间,总是会怀疑自己写的文章够不够好...
前面我们使用 RTCPeerConnection.addTrack() 来把我们的音视讯传送给对方 ...
单纯纪录自己用的 Guzzle Request 模板 简单版 use GuzzleHttp\Clie...
前言: 大家好,这是我第一次参加铁人赛 主要是想记录一下自己学过的东西 并和大家分享一些我觉得很重要...
复制代码保存*.sh,然后bash *.sh执行 #!/bin/bash PATH=/bin:/sb...