保留了var和function。新增加了let、const、class和import。
而且,let、const、class宣告的全域性變數再也不會和全域性物件的屬性掛鉤了。
------------
let------------
1、let只在所在的**塊中有效
for (var i = 0; i < 10; i++) {}
console.log(i); //10
for(let j = 0; j < 10; j++) {}
console.log(j);// error: j is not define
2、以前我們需要用iife解決的問題
for (var i = 0; i < 5; i++) ,0);
} for (var k = 0; k < 5; k++) ,0);
})(k);
} for (let j = 0; j < 5; j++) ,0);
} 3、不存在變數宣告提公升
console.log(foo); // 輸出undefined
console.log(bar); // 報錯referenceerror
var foo = 2;
let bar = 2;
可能動手實踐的同學會發現在webpack配置的es6環境中。
並不會出現這種情況,那主要是babel轉碼是還是講let轉成了var,不要糾結這個。
4、暫時性死區tdz
var temp = 123;
if (true)
其實這個也可以解釋上面那條 不存在變數宣告提公升。
同時在tdz區域中使用typeof temp 也是不安全的。
但是你typeof 未宣告的變數 倒是返回undefined, 這就是tdz的效果。
同樣這裡你也可能試驗不出來,你看一下bundle.js,你就懂了。
5、let不允許重複宣告
----------
const
----------
1、大部分與let差不多。
2、const (唯讀)(一旦宣告必須賦值)
const max = 123;
max = 1; //轉碼階段就爆錯了。
3、對於復合型別變數 (可以給他的屬性賦值)
const a = {};
a.name = "dai";
a.age = 21;
4、如何你不想新增屬性
const b = object.freeze({});
b.name = 'dai'; //typeerror
插曲–es6引入了塊級作用域
其實這也解釋了為什麼let、const在自己所在的**塊有效了。
console.log(b); //10
} console.log(a); //1
}
---------
class
---------
1、class作為es6的語法糖,實際上es5也可以實現的。
class point
tostring ()
} //上面是乙個類
object.assign(point.prototype, ,
gety ()
})let p1 = new point(1,2);
console.log(p1.tostring()); //1,2
console.log(p1.getx()); //1
console.log(p1.gety()); //2
console.log(object.keys(point.prototype)); // ["getx", "gety"]
(1)、方法之間不需要逗號分隔
(2)、tostring () {} 等價於 tostring: function () {}
(3)、你仍然可以使用point.prototype
(4)、你可以用object.assign()一次性擴充套件很多方法
(5)、類內部定義方法多是不可以列舉的
(6)、constructor(){}是乙個預設方法,如果沒有新增,會自動新增乙個空的。
(7)、constructor預設返回例項物件(this),完全可以指定返回其他的物件。
(8)、必須用new呼叫
(9)、不存在變數提公升
(10)、當用乙個變數去接受class時,可以省略classname
(11)、es6不提供私有方法。
2、使用extends繼承
class threedpoint extends point
tostring ()
static getinfo()
get z()
set z(value)
} threedpoint.getinfo(); // "static method"
let ta = new threedpoint(2,3,4);
console.log(ta.tostring()); //2,3,4
console.log(ta.z); // 4
ta.z = 200; // 200
console.log(object.getprototypeof(threedpoint)); //point
(1)、constructor中必須呼叫super,因為子類中沒有this,必須從父類中繼承。
(2)、子類的__proto__屬性總是指向父類
(3)、子類的prototype屬性的__proto__總是指向父類的prototype
(4)、object.getprototypeof()獲取父類
(5)、super作為方法只能在constructor中
(6)、super作為屬性指向父類的prototype.
(7)、在constructor中使用super.x = 2,實際上this.x = 2;但是讀取super.x時,又變成了父類.prototype.x。
(8)、原生建構函式是無法繼承的。
(9)、get set 方法可以對屬性的賦值和讀取進行攔截
(10)、靜態方法不能被例項繼承。通過static宣告
(11)、靜態屬性只能 threedpoint.name = "123" 宣告 (與static沒什麼關係)
-----------
import
-----------
1、es6引入了自己的模組系統。通過export匯出,import匯入。
2、與commonjs不同的是,它是獲取模組的引用,到用的時候才會真正的去取值。
3、例如student.js中:
let student = [
,] export default student; // 這種匯出方式,你可以在import時指定它的名稱。
import studentlist from './student.js'; //指定名稱
console.log(studentlist[0].name); //xiaoming
ES6 變數宣告方式
var,function,let,const,import,class1.let只在所在的 塊中有效 2.以前我們需要用iife解決的問題 3.不存在變數宣告提公升 4.暫時性死區tdz 1.let只在所在的 塊中有效 2.以前我們需要用iife解決的問題 3.不存在變數宣告提公升 console....
ES6之新的變數宣告方式
作用域就是變數的有效範圍 之前只有全域性作用域和函式作用域 let和const是新的變數宣告方式 輸出結果 使用let定義的變數只能用在定義它的那個塊裡 在這個塊之外是不能使用這個變數的 就是將宣告的變數繫結在宣告該變數的塊裡 同理 可以看做為最簡單的塊級元素 大括號外當然也訪問不到 輸出結果 因為...
Es6之變數宣告
es6變數宣告let 和 canst,let 所宣告的變數具有塊級作用域,且宣告的變數不會前置,而const宣告的是不變了常量 let test test let 所宣告的變數只在塊級作用域內有效,而var就不同 for var i 1 i 5 i console.log str 輸出hello.c...