面試官 說說var let const之間的區別

2021-10-14 11:04:28 字數 4748 閱讀 5386

故心故心故心故心小故衝啊

在es5中,頂層物件的屬性和全域性變數是等價的,用var宣告的變數既是全域性變數,也是頂層變數

注意:頂層物件,在瀏覽器環境指的是window物件,在 node 指的是global物件

var a =10;

console.

log(window.a)

// 10

使用var宣告的變數存在變數提公升的情況

console.

log(a)

// undefined

var a =

20

在編譯階段,編譯器會將其變成以下執行

var a

console.

log(a)

a =20

使用var,我們能夠對乙個變數進行多次宣告,後面宣告的變數會覆蓋前面的變數宣告

var a =

20var a =

30console.

log(a)

// 30

在函式中使用使用var宣告變數時候,該變數是區域性的 —var作用域 函式作用域

var a =

20function

change()

change()

console.

log(a)

// 20

而如果在函式內不使用var,該變數是全域性的

var a =

20function

change()

change()

console.

log(a)

// 30

let是es6新增的命令,用來宣告變數

用法類似於var,但是所宣告的變數,只在let命令所在的**塊內有效

console.

log(a)

// referenceerror: a is not defined.

不存在變數提公升

console.

log(a)

// 報錯referenceerror

let a =

2

這表示在宣告它之前,變數a是不存在的,這時如果用到它,就會丟擲乙個錯誤

只要塊級作用域內存在let命令,這個區域就不再受外部影響

var a =

123if

(true

)

使用let宣告變數前,該變數都不可用,也就是大家常說的「暫時性死區」最後,let不允許在相同作用域中重複宣告

let a =

20let a =

30// uncaught syntaxerror: identifier 'a' has already been declared

注意的是相同作用域,下面這種情況是不會報錯的

let a =

20

因此,我們不能在函式內部重新宣告引數

function

func

(arg)

func()

// uncaught syntaxerror: identifier 'arg' has already been declared

const宣告乙個唯讀的常量,一旦宣告,常量的值就不能改變

const a =

1a =

3// typeerror: assignment to constant variable.

這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值

const a;

// syntaxerror: missing initializer in const declaration

如果之前用var或let宣告過變數,再用const宣告同樣會報錯

var a =

20let b =

20const a =

30const b =

30// 都會報錯

const實際上保證的並不是變數的值不得改動,而是變數指向的那個記憶體位址所儲存的資料不得改動

對於簡單型別的資料,值就儲存在變數指向的那個記憶體位址,因此等同於常量

對於複雜型別的資料,變數指向的記憶體位址,儲存的只是乙個指向實際資料的指標,const只能保證這個指標是固定的,並不能確保改變量的結構不變

const foo =

;// 為 foo 新增乙個屬性,可以成功

foo.prop =

123;

foo.prop // 123

// 將 foo 指向另乙個物件,就會報錯

foo =

;// typeerror: "foo" is read-only

其它情況,const與let一致

var、let、const三者區別可以圍繞下面五點展開:

var宣告的變數存在變數提公升,即變數可以在宣告之前呼叫,值為undefined

let和const不存在變數提公升,即它們所宣告的變數一定要在宣告後使用,否則報錯

// var

console.

log(a)

// undefined

var a =

10// let

console.

log(b)

// cannot access 'b' before initialization

let b =

10// const

console.

log(c)

// cannot access 'c' before initialization

const c =

10

var不存在暫時性死區

let和const存在暫時性死區,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數

// var

console.

log(a)

// undefined

var a =

10// let

console.

log(b)

// cannot access 'b' before initialization

let b =

10// const

console.

log(c)

// cannot access 'c' before initialization

const c =

10

var不存在塊級作用域

let和const存在塊級作用域

// var

console.

log(a)

// 20

// let

console.

log(b)

// uncaught referenceerror: b is not defined

// const

console.

log(c)

// uncaught referenceerror: c is not defined

var允許重複宣告變數

let和const在同一作用域不允許重複宣告變數

// var

var a =

10var a =

20// 20

// let

let b =

10let b =

20// identifier 'b' has already been declared

// const

const c =

10const c =

20// identifier 'c' has already been declared

var和let可以

const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變

// var

var a =

10a =

20console.

log(a)

// 20

//let

let b =

10b =

20console.

log(b)

// 20

// const

const c =

10c =

20console.

log(c)

// uncaught typeerror: assignment to constant variable

能用const的情況盡量使用const,其他情況下大多數使用let,避免使用var

面試官 說說資料庫事務吧

面試官在資料庫這方面最常問的除了sql優化,還有資料庫事務 儲存引擎等相關知識。上期有人說沒有自動門,所以這一期我特地造了自動門,這門沒有四五塊造不下來。注意 只是crud的搬磚工就不需要看了,看了也忘了,只需要拉到最後,點讚 在看 分享,一鍵三連然後收藏起來就行了。事務是指是程式中一系列嚴密的邏輯...

面試官感悟

其實之前也面試過幾個人,但都是零星的跟著別人一起,我也只是偶爾詢問一兩句就結束了。昨天這是一場真正的大型招聘會,而且面試也是相當規範,面對的還是社招。對於我這種初出茅廬來說,這是第一次真正接觸參與的一場招聘會,想起要面那些比自己工作年限還長的人,心裡很沒底,有點小擔心和緊張的。當然一整天下來也算體驗...

面試官問題

解釋一些壓縮感知理論 壓縮感知是一種全新的訊號採集和恢復理論,它打破了傳統的奈奎斯特取樣定律,可以從更少的觀測訊號訊號中重建出高質量的原始訊號。其基本思想是,當訊號是稀疏或可壓縮時,我們可以通過乙個隨機測量矩陣將高維訊號投影到低維空間,再通過乙個求解優化問題高概率的恢復原始訊號。解釋一下壓縮感知磁共...