透徹const,let,var三者宣告的區別

2021-09-25 23:31:52 字數 4306 閱讀 6238

var宣告的變數有以下特性,我們一一揭秘

1.重複宣告

​ var宣告的變數可以重宣告,因為js的執行順序由上往下,因此後宣告的會覆蓋原宣告

var num = 1;

var num = 2;

console.log(num);//2

2.重新賦值

​ var宣告的變數可以重新賦值,賦值後的覆蓋原來的

var num = 1;

num = 2;

console.log(num);//2

3.變數提公升

​ 我們知道js的執行順序是由上往下,按照正常的邏輯如果我們在乙個變數未宣告之前就使用它肯定是報錯的

​ 但是var宣告的變數存在變數提公升的問題,如下

console.log(num);//undefined

var num;

console.log(cont);//undefined

var cont=2;

​ 第乙個undefined可以理解,因為變數提公升,但是沒有賦值預設就是undefined

​ 第二個cont變數其真實順序應是var cont -->console.log(cont) -->cont =2 因此得到的也是undefined

4.作用域規則

​ 我們知道js有乙個塊級作用域,用「 {} 」 表示,意思就是在塊級作用域裡面的東西只在此塊有效果,看招

​ 情況一:{}內的**沒有被執行,但是由於變數提公升,因此num為undefined

​ 情況二:{}內的**被執行了,因此num輸出1

​ 情況三:函式不算塊級作用域,它有自己的函式作用域,因此在函式內宣告的變數為區域性變數

​ 情況四:省略了關鍵字,num被宣告為全域性變數,因此在函式外也可以訪問

​ 情況五:在for迴圈內宣告的var i 竟然變成了全域性變數,這種情況我們是不願看到的

​ 情況六:理想應該是0到9,但是從情況五我們就知道在for內var宣告的變數是全域性作用域,迴圈內的延時

​ 函式還沒有執行人家for迴圈就跑完了,i最後被賦予了10,因此10個延時函式得到的 i 的值都是10

​ 那怎麼讓其結果輸出正常呢?解決:將延時函式用乙個立即執行函式套住

​ 情況七:我們知道window是全域性的,這裡用var宣告的變數會繫結全域性作用域

情況一:		if(false)

console.log(num); //undefined

情況二: if(true)

console.log(num);//1

情況三: function fun()

fun()

console.log(num);//not defind

情況四: function fun()

fun()

console.log(num);//1

情況五: for (var i = 0; i < 10; i++)

console.log(i); // 10

情況六: for (var i = 0; i < 10; i++) , 100 * i);

}

情況七: var value = 1;

console.log(window.value); // 1

1.重複宣告

​ 兩種宣告方式都一樣,無法重複宣告

let num = 1;

let num = 2;

var num = 3;

console.log(num);//'num' has already been declared

const value=1;

const value=2;

console.log(value); //'value' has already been declared

2.重新賦值

​ let宣告的基本型別變數可以重新賦值

​ let宣告的複雜型別變數可以重新賦值

​ const宣告的基本型別變數無法重新賦值

​ const宣告的複雜型別變數無法重新賦值

基本型別:		let num=1;

num=2;

console.log(num);//2

複雜型別: let num=;

num=;

console.log(num.name);//undefined

console.log(num.age);//123

基本型別 const value=1;

value=2;

console.log(value); //assignment to constant variable.

複雜型別:

情況一 const num=;

num=;

console.log(num.age);//assignment to constant variable

情況二 const value=;

value.name="李四"

console.log(value.name);//李四

允許修改其屬性,因為修改屬性並未改變其位址指向,

就想人可以更換器官

3.變數提公升

console.log(bar); //not defind

let bar;

console.log(bar); //undefined

console.log(num);missing initializer in const declaration

const num;

console.log(num);missing initializer in const declaration

4.暫時性死區

​ 我們知道用var宣告的變數會提公升,因此只要你宣告了在哪個地方都能使用,雖然其值是undefined

​ 但是const宣告的變數在宣告到為其賦值之間是不可以使用的,稱為暫時性死區,如下

console.log(num);//missing initializer in const declaration

const num;

console.log(num);missing initializer in const declaratio

5.作用域規則

​ 情況一和情況二說明const和let宣告的變數都是塊級作用域,也沒有變數提公升

​ 情況三:在函式內宣告其在函式內生效,這個var,let ,const都是一樣

​ 情況四:用const或者let宣告的變數不會繫結全域性window

​ 情況五:因為const和let宣告的變數有跨級作用域,因此結果not defined很符合邏輯

​ 情況六:為什麼列印正常呢?因為let和const是塊級作用域,而且不可重複宣告,因此迴圈0到9的時候for迴圈

​ 相當建立了9個塊級作用域,每個塊級作用域都儲存了乙個 i 和延時函式,因此結果正常,而var宣告的變數

​ 我們知道是沒有塊級作用域的,因此我們for迴圈0到9的時候實際上是 i 一直都在window這乙個大作用域

​ 下重複宣告並且賦值: 第一次:var i=0 =>執行迴圈體 ,第二次:var i=1 =>執行迴圈體

情況一:	  if(false)

console.log(num);//not defined

console.log(value)//not defined

情況二: if(false)

console.log(num);//not defined

console.log(value)//not defined

情況三: function fun()

fun()

console.log(num);//not defind

console.log(value);//not defind

情況四: const num = 1;

let value = 2;

console.log(window.num); //undefined

console.log(window.value); //undefined

情況五: for (let i = 0; i < 10; i++)

console.log(i); //not defined

情況六: for (let i = 0; i < 10; i++) , 100 * i);

}

STRCPY,MEMSET,MEMCPY三者的區別

memset 用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為 或 0 例 char a 100 memset a,0 sizeof a memcpy 用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度 例 char a 100 b 50 memcpy...

View,Activity,Window三者的關係

在activity中,通過setcontentview就可以顯示xml的布局檔案了,也就是把乙個個view控制項組合在一起,首先,這個activity的方法setcontentview有三個過載的方法。public void setcontentview int layoutresid public...

Activity Window View三者的關係

首先分別介紹下這三者 然後一句話介紹下三者的關係 activity通過window來實現檢視元素的展示,window可以理解為乙個容器,盛放著乙個個的view,用來執行具體的展示工作。當我們執行程式的時候 在activity中呼叫attach,建立了乙個window 建立的window是其子類pho...