故心故心故心故心小故衝啊
在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的搬磚工就不需要看了,看了也忘了,只需要拉到最後,點讚 在看 分享,一鍵三連然後收藏起來就行了。事務是指是程式中一系列嚴密的邏輯...
面試官感悟
其實之前也面試過幾個人,但都是零星的跟著別人一起,我也只是偶爾詢問一兩句就結束了。昨天這是一場真正的大型招聘會,而且面試也是相當規範,面對的還是社招。對於我這種初出茅廬來說,這是第一次真正接觸參與的一場招聘會,想起要面那些比自己工作年限還長的人,心裡很沒底,有點小擔心和緊張的。當然一整天下來也算體驗...
面試官問題
解釋一些壓縮感知理論 壓縮感知是一種全新的訊號採集和恢復理論,它打破了傳統的奈奎斯特取樣定律,可以從更少的觀測訊號訊號中重建出高質量的原始訊號。其基本思想是,當訊號是稀疏或可壓縮時,我們可以通過乙個隨機測量矩陣將高維訊號投影到低維空間,再通過乙個求解優化問題高概率的恢復原始訊號。解釋一下壓縮感知磁共...