前言:什麼是ES6?ECMAScript 6(簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式釋出了。其中相比較於ES5新增了諸多的特性,並且ES6可轉換為ES5的語法。->線上ES6轉換為ES5工具。
本系列學習隨筆參考了阮一峰老師的《ES6標準入門》。
一、let關鍵字
1、解決變數提升現象
我們在js中定義變數時,用var宣告會出現這種情況:
console.log(a); //不會報錯,輸出為undefined
var a=1;
這就是js的變數提升現象,當瀏覽器在解析函式時,會將var 宣告的變數宣告到函式的最前端,導致變數在宣告之前使用不會報錯,此時let關鍵字就解決了這個問題。let的作用域只在當前的程式碼塊起作用。
console.log(a); //ReferenceError:a is not defined
let a=1;
2、不同程式碼塊互不影響
由於let關鍵字作用只在當前程式碼塊中起作用,所以不會受外部影響。
function n() {
let a = 1;
if (true) {
let a = 5;
}
console.log(a); // 輸出1
};
3、同一程式碼塊不能重複定義
{
var a=1;
var a=2;//無報錯
}
{
let a=1;
let a=2;//Uncaught SyntaxError: Identifier `a` has already been declared
}
二、const關鍵字
1、const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。
const PI = 3.1415;
PI = 3;//Uncaught TypeError: Assignment to constant variable.
其本質是物件所儲存的記憶體地址不可變。
const PI={}
PI.num=3.14159;//不會報錯
PI={num=3.14159};//VM1187:1 Uncaught SyntaxError: Identifier `PI` has already been declared
2、const宣告的常量必須宣告時就賦值;
const PI; // SyntaxError: Missing initializer in const declaration
3、const宣告的常量跟let的作用域一樣。
if (true) {
const PI = 3.14159;
}
console.log(PI); // Uncaught ReferenceError: PI is not defined
三、super 關鍵字
我們都知道,this關鍵字總是指向函式所在的當前物件,ES6又新增super關鍵字,指向當前物件的原型物件。他有兩種使用方式:
1、當做函式使用
class parent {
constructor() {
console.log(11)
}
}
class child extends parent{
constructor() {
super();
}
}
let c = new child();//列印11
當做函式使用時,super()呼叫會生成一個空物件,作為context來呼叫父類的constructor,返回this物件,作為子類constructor的context繼續呼叫建構函式。
2、當做物件使用
const proto = {
foo: `hello`
};
const obj = {
foo: `world`,
find() {
return super.foo;
}
};
Object.setPrototypeOf(obj, proto);
obj.find() // "hello"
上面程式碼中,物件obj.find()方法之中,通過super.foo引用了原型物件proto的foo屬性。
3、注意區分super與this
說到super與this的區別,我們就要先來看一下this關鍵字:
this關鍵字最終指向的是呼叫它的物件。我們可以看下面兩個例子;
function GetThis(){
console.log(this);
};
GetThis();//列印出window物件。
為什麼會這樣呢。其實最後的呼叫我們也可以寫成window.GetThis();呼叫他的就是window物件。
如果不信的話我們可以再舉個例子;
var getThis={
user:`me`,
fn:function(){
console.log(this);
}
}
getThis.fn();//列印的就時getThis物件;
接下來我們再看一個this與super結合的例子就能理解了:
const proto = {
x: `hello`,
foo() {
console.log(this.x);
},
};
const obj = {
x: `world`,
foo() {
super.foo();
}
}
Object.setPrototypeOf(obj, proto);
obj.foo()// "world"
上面程式碼中,super.foo指向原型物件proto的foo方法,但是繫結的this卻還是當前物件obj,因此輸出的就是world。