const 定義的變量可以被修改嗎房维?

var、let抬纸、const相關問題

  • 1咙俩,var
  • 2,let
  • 3湿故,const
  • 4阿趁,塊級作用域
  • 5,三者區(qū)別
  • 6坛猪,const 定義的變量可以修改嗎脖阵?
  • 7,經(jīng)典面試題

1墅茉,var

1, 聲明提升
console.log(num) // undefined
var num = 100

2, 變量覆蓋
var num1 = 100
var num1 = 200
conosle.log(num1) // 200

3, 沒有塊級作用域
function fn() {
  for (var i = 0; i <= 5; i++) {
    console.log(i)  // 0 1 2 3 4 5
  }
  console.log(i)  // 6
}
fn()

2命黔,let

1, let 聲明的變量具有塊級作用域的特征
function fn() {
  let a = 10
}
console.log(a) // a is not defined

2, 在同一個塊級作用域,不能重復聲明變量
function fn() {
  let a = 10
  let a = 20
}
console.log(a) // Identifier 'a' has already been declared

3, let 聲明的變量不存在變量提升就斤,換種說法就是let聲明存在暫時性死區(qū)(TDZ)
console.log(num) // Cannot access 'num' before initialization
let num = 10

3移宅,const

1, const 聲明的變量具有塊級作用域的特征
function fn() {
  const a = 10
}
console.log(a) // a is not defined

2, 在同一個塊級作用域起愈,不能重復聲明變量
function fn() {
  const a = 10
  const a = 20
}
console.log(a) //  Identifier 'a' has already been declared

3, const 聲明的變量不存在變量提升幸撕,換種說法就是const聲明存在暫時性死區(qū)(TDZ)
console.log(num) // Cannot access 'num' before initialization
const num = 10

4, const 聲明一旦定義后奸鬓,不能修改
const num = 100
num = 200
console.log(num) // Assignment to constant variable.

4濒析,塊級作用域

ES5中作用域有:全局作用域月匣、函數(shù)作用域承边,沒有塊級作用域的概念掖蛤。

ES6新增了塊級作用域,由 {} 包括刁标,if 語句for 語句里面的 {} 都屬于塊作用域

{
  var num = 100
  console.log(num) // 100
}
console.log(num) // 100 可見颠通,通過var定義的變量可以跨塊作用域訪問到

function fn() {
  var num = 100
  console.log(num) // 100
}
console.log(num) // num is not defined 可見,通過var定義的變量不能跨函數(shù)作用域訪問到

if (true) {
  var num = 100
}
console.log(num) // 100

for (var i = 0; i <= 5; i++) {
  var num = 100
}
console.log(i) // 6
console.log(num) // 100
if 語句和 for 語句中用 var 定義的變量可以在外面訪問到膀懈,可見顿锰,if 語句和 for 語句屬于塊級作用域,不屬于函數(shù)作用域

5启搂,三者區(qū)別

  • var 定義的變量硼控,沒有塊的概念,可以跨塊訪問, 不能跨函數(shù)訪問
  • let 定義的變量胳赌,只能在塊作用域里訪問牢撼,不能跨塊訪問,也不能跨函數(shù)訪問
  • const 用來定義常量疑苫,使用時必須初始化(即必須賦值)熏版,只能在塊作用域里訪問,且不能修改
// 塊級作用域
{
  var a = 100
  var b = 200
  var c = 300
  var a1
  let b1
  // const c1
  console.log(a) // 100
  console.log(b) // 200
  console.log(c) // 300
  console.log(a1) // undefined
  console.log(b1) // undefined
}
console.log(a) // 100
console.log(b) // 200
console.log(c) // 300

// 函數(shù)作用域
(function fn() {
  var a = 100
  let b = 200
  const c = 300
  console.log(a) // 100
  console.log(b) // 200
  console.log(c) // 300
})()
console.log(a) // a is not defined
console.log(b) // b is not defined
console.log(c) // c is not defined

6捍掺,const 定義的變量可以修改嗎撼短?

const 定義的基本類型不能改變,但是定義的對象是可以通過修改對象屬性等方法改變的

const num = 100
num = 200
console.log(num) // Assignment to constant variable.

const person = {
  name: 'Tom',
  age: 18
}
person = {
  name: 'Jerry',
  age: 20
}
console.log(person) // Assignment to constant variable.

const person = {
  name: 'Tom',
  age: 18
}
person.name = 'Jerry'
console.log(person) // {name: 'Jerry', age: 18}

基本數(shù)據(jù)類型的變量保存在棧區(qū)中挺勿,基本數(shù)據(jù)類型的值直接在棧內(nèi)存中存儲曲横,值與值之間是獨立存在的,修改一個變量不會影響其他的變量不瓶。

引用數(shù)據(jù)類型的值是同時保存在棧內(nèi)存和堆內(nèi)存的對象禾嫉,棧區(qū)保存了對象在堆區(qū)的地址。

const 聲明的 person 給屬性重新賦值是可以的湃番,但是給 person 重新賦值是不可以的夭织,那樣會改變 person 在棧區(qū)的地址

7,經(jīng)典面試題

for (var i = 0; i <= 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}
console.log(i)
image

setTimeout 是異步執(zhí)行的吠撮,1000ms后向任務隊列里添加一個任務尊惰,只有主線程的全部執(zhí)行完才會執(zhí)行任務隊列里的任務,所以當主線程 for 循環(huán)執(zhí)行完之后 i 的值為 6泥兰, 這時候再去執(zhí)行任務隊列里執(zhí)行任務弄屡, i 全部是 6。

每次 for 循環(huán)的時候 setTimeout 都會執(zhí)行鞋诗,但是里面的 function 則不會執(zhí)行被放入任務隊列膀捷,因此放了 6 次, for 循環(huán)的 6 次執(zhí)行完之后不到 1000ms削彬, 100ms后全部執(zhí)行任務隊列里的函數(shù)全庸,所以輸出 6 個 6秀仲。

for (let i = 0; i <= 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}
console.log(i)
image

let定義的 i 事塊級作用域,每個 i 只能存活到大括號結(jié)束壶笼,并不會把后面的 for 循環(huán)的 i 值賦給前面的 setTimeout 中的 i神僵,而var 定義的 i是局部變量,這個 i 的生命周期不受for 循環(huán)的大括號限制覆劈。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末保礼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子责语,更是在濱河造成了極大的恐慌炮障,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坤候,死亡現(xiàn)場離奇詭異胁赢,居然都是意外死亡,警方通過查閱死者的電腦和手機铐拐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門徘键,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遍蟋,你說我怎么就攤上這事吹害。” “怎么了虚青?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵它呀,是天一觀的道長。 經(jīng)常有香客問我棒厘,道長纵穿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任奢人,我火速辦了婚禮谓媒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘何乎。我一直安慰自己句惯,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布支救。 她就那樣靜靜地躺著抢野,像睡著了一般。 火紅的嫁衣襯著肌膚如雪各墨。 梳的紋絲不亂的頭發(fā)上指孤,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音贬堵,去河邊找鬼恃轩。 笑死结洼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的详恼。 我是一名探鬼主播补君,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼引几,長吁一口氣:“原來是場噩夢啊……” “哼昧互!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伟桅,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敞掘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后楣铁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖雁,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年盖腕,在試婚紗的時候發(fā)現(xiàn)自己被綠了赫冬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡溃列,死狀恐怖劲厌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情听隐,我是刑警寧澤补鼻,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站雅任,受9級特大地震影響风范,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沪么,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一硼婿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧禽车,春花似錦寇漫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钦勘,卻和暖如春陋葡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彻采。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工腐缤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捌归,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓岭粤,卻偏偏與公主長得像惜索,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剃浇,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容