ECMAScript 是什么?
首先,我們都知道JavaScript由三部分組成:ECMAScript,DOM,BOM;
其中的ECMAScript是Javascript的語法規范。
ECMAScript定義了很多東西,如:
- 語法-----解析規則,關鍵字,語句,聲明,操作等
- 類型-----布爾型,數字,字符串,對象等
- 原型和繼承
- 內置對象,函數的標准庫----------JSON, Math, 數組方法,對象方法等
瀏覽器兼容:
目前Google和Firefox瀏覽器對ES6新特性的兼容最友好。而IE9則有問題。對於不兼容的瀏覽器,我們可以只用轉換工具如,babel。我們使用nodejs的包管理工具npm來安裝babel。在我們的js文件前先引入 browser.min.js 。
(1)ES6中新增的let關鍵字
之前我們聲明一個變量時,都是使用關鍵字var,那新增加的let和var有什么不同呢?
var的不足之處一:
var arr=[];
for (var i=0;i<10;i++){
arr[i]=function(){
console.log(i);
};
}
arr[8](); // console.log(i); 的結果為 10
同樣的換成 let之后就沒問題:
var arr=[];
for (let i=0;i<10;i++){
arr[i]=function(){
console.log(i);
};
}
arr[8](); // console.log(i); 的結果為 8
這是由於,本來的js是沒有塊級作用域的,用var定義i時,雖然在for循環中定義,但在執行時,依然會被提升。當執行arr[8]()時,循環已經完成,這時的i=10;所以再去執行 arr[8]()時,console.log(i),i=10;
而是用let定義i,i就只能存在與for循環的塊級作用域,不會被提升。
(塊,只的是 一組{}之間的部分。)
var的不足之處二:
也就是變量提升。var 會被提升定義;let不會。
var a=1;
(function(){
alert(a);
var a=2;
})(); //undefined 表示只聲明,為賦值;
同樣的換做let之后:
var a=1;
(function(){
alert(a);
let a=2;
})(); //報錯: Uncaught ReferenceError: a is not defined(…)
這是因為,用let定義后,變量a的定義不會被提升。且在塊級作用域內封閉,不會受到外界a的影響。在使用a(alert(a))時,a尚未定義,所以報錯。因此,在使用let時,一定注意,變量要先聲明后使用。
使用let時注意:
注意一: 在同一塊級作用域下,不能重復聲明同一個變量。
{
var a=1;
let a=2;
} //報錯
{
let a=1;
let a=2;
} //報錯
注意二:在函數內,不能用let重新聲明函數的參數。
function say(word){
let word='hello';
alert(word);
}
say('hi'); //報錯
(2)ES6中新增的const關鍵字
const是常量(contsant)的縮寫,與let相比,const專門用來聲明一個常量。
特點:
- 不可修改
const name='a';
name='b'; //報錯
- 塊級作用域
if(1){
const name='a';
}
alert(name); //報錯
- 不存在變量提升,必須先聲明后使用
if(1){
alert(name); //報錯
const name='a';
}
- 不可重復聲明同一個變量
var name='a';
const name='b'; //報錯
- 聲明后必須賦值
const name; //報錯
注意:當常量為一個對象時:
const Person={'name':'a'};
Person.name='b';
Person.age='13';
console.log(Person) // {'name':b,'age':'13'}; 輸出正常。
這是由於const聲明了一個引用類型的常量,使用的是傳址賦值。也就是不修改地址,只修改地址中的值。
———————————————————————
參考公眾號 :web前端教程