1. 程式人生 > 其它 >spring boot專案01:nothing(基礎)

spring boot專案01:nothing(基礎)

前言:ES6新推出的語法具有自己的特性,我們在實際開發時,一個專案中不可能指定使用用ES幾,而是根據實際情況,所有的配合使用。

例如:

if(true){
    var c=88;
    let d=99;
}
console.log(c);//88
console.log(d);//報錯

這裡為什麼var就可以,而let定義的變數就不可以呢?

這是因為:var的作用域就是全域性作用域和函式作用域,執行環境也就是隻有全域性執行環境和函式作用域。

let定義的變數的作用域是:全域性作用域、函式作用域、塊級作用域({}包圍的作用域如:if、for包圍的)。對應的執行環境也應該包括(全域性執行環境、函式執行環境、塊級執行環境。)。

【1】塊級執行環境,程式碼執行到{}包圍程式碼的時候,建立一個塊級的執行環境,這個執行環境在建立的同時也被執行(邊建立邊執行):

1.作用域鏈。當前的活動變數為作用域的最前端。

2.this和外部的函式的執行環境或者全域性執行的this一致。

3.活動變數,儲存著let或者const定義的變數,以及for中定義的i等(不存在變數提升)

當塊級執行環境中的程式碼執行完成之後,該執行環境被銷燬,同時變數物件以及屬性均被銷燬,外部訪問不到其變量了。

【2】函式、全域性執行環境

對於函式和全域性環境來說,let、const定義的變數不能成為函式或全域性執行環境變數物件的屬性。可以說let和const定義的變數不在執行環境建立時被新增到變數物件(VO)中,而是在執行階段將其以另一種形式新增活動物件(AO)中,而且不是AO的屬性,以另外一種形式存在。

總結:當執行全域性程式碼或者呼叫函式的時候都會分別建立自己的一個執行環境,執行程式碼期間,遇到{}比如if或者for的時候,(1)如果裡面有let或者const,則會給建立一個塊級的執行環境(這個塊級執行環境會有一個變數物件,但是這個變數物件是活動物件即一行行執行,不存在變數提升等。還有一個作用域鏈。);(2)如果裡面沒有let或者const則不會建立塊級的執行環境(即執行環境只有全域性和函式)。在執行全域性或者函式程式碼期間,如果遇到let或者const,將其新增到活動物件(AO)中,只不過不是和var定義的一樣是AO的屬性,而是以另一種形式存在

(一)塊作用域構造let和const

let宣告(宣告變數)

1.塊級作用域(即let宣告的變數除了全域性作用域、函式作用域還有塊級作用域):

let和var的用法一致,都是用來宣告變數,只不過let宣告的變數不會被提升,可以把變數的作用域限制在當前程式碼塊中。也就是{}中。

例如:

2. 使用let宣告的變數名不可以和同一作用域下的任何變數重名

例如:var index=0;

var index=10;

let index=100//報錯:因為在這個作用域中,已經有了變數名為index的變數。

注意:但是不同的作用域中可以是重複。例如:

var index=0

{let index=10}

const宣告常量

const用於宣告常量,其特點如下:

1. 每個通過const關鍵字宣告的常量必須在宣告的同時進行初始化;

例如:const x=10; //正確

const x;

x=10 //報錯

2.與let類似,在同一作用域下用const宣告已經存在的識別符號也會導致語法錯誤,無論該識別符號是使用var 還是let宣告的。

3.如果const宣告的是物件,物件本身的繫結不能修改,但是物件的屬性和屬性值是可以修改的。例如:

let和const的全域性塊作用域繫結:

我們知道,在全域性作用域中使用var宣告的變數或物件,將作為瀏覽器環境中的window物件的屬性,這意味著使用var很可能會無意中覆蓋一個已經存在的全域性屬性。例如:

getting被定義為一個全域性變數,並立即稱為window物件的屬性。定義的全域性變數Screen,則覆蓋了window物件中原有的Screen屬性。

如果在全域性作用域下使用let或者const,則會在全域性作用域下建立一個新的繫結,但該繫結不會成為window物件的屬性。程式碼如下:

上述的Screen是內建的屬性,而不是通過var定義的。如果通過var 定義 ,因為在同一作用域下let或者const不能使用重名即不能使用已有的變數名。

(二)模板字面量

ES引入了模板字面量,對於字串的操作進行了增強方式。

  • 多行字串(真正的多行字串)
  • 字串佔位符(可以將變數或JavaScript表示式嵌入佔位符中並將其作為字串的一部分輸出到結果中)

2.1多行字串

模板字面量的基礎語法就是用反引號(`)來替換字串的單、雙引號。例如:

let message=`Hello World`;

這句程式碼使用模板字面量建立了一個字串,並賦值給message變數,這時變數的值與一個普通的字串並無差異

如果想要在字串中使用反引號,那麼同樣使用反斜槓(\)將它轉義即可。如下所示:

var message=`Hello \`world`;

注:在模板字面量中,不需要轉義單、雙引號。

在ES5中,如果一個字串量要分為多行書寫,那麼可以採用兩種方式來實現:即\和+來拼接字串(/表示承接下一行的程式碼),例如:

var  message="Hello \
 World!"
var g="welcom"+
           "you"

但是將二者列印在控制檯,仍然顯示在一行,沒有換行。

如果要真正換行,則需要手動加入換行符:

var message=“Hello\n\

Wordl”

var g="Welcom"

+ "\n"

+"you"

在ES6中,使用模板字面量語法,可以很方便地實現多行字串的建立。如果需要在字串中新增新的一行,只需要在程式碼中直接換行即可。程式碼如下所示:

var message=`hello
wolrd
          !`;
console.log(message)

注意:在反引號中的所有空白字元(包括但不限於空格、換行符、製表符)都屬於字串的一部分。