1.什麼是ES 6:
ES 6 全稱 ECMAScript 6.0,也叫 ES 2015,它是2015年6月發佈的,是JavaScript語言的下一代標準,它的目標,是使得JavaScript語言可以用來編寫複雜的大型應用程序,成爲企業級開發語言。
ECMAScript 和 JavaScript 的關係:前者是後者的規格,後者是前者的一種實現。
2.瀏覽器對ES6的支持:
ES6提供了許多新的特性,但並不是所有的瀏覽器都能夠完美支持,附一段桌面端瀏覽器對ES6的支持情況:
- Chrome:51 版起便可以支持 97% 的 ES6 新特性。
- Firefox:53 版起便可以支持 97% 的 ES6 新特性。
- Safari:10 版起便可以支持 99% 的 ES6 新特性。
- IE:Edge 15可以支持 96% 的 ES6 新特性。Edge 14 可以支持 93% 的 ES6 新特性。(IE7~11 基本不支持 ES6)
3.ES6的一些新特性:
(1)let :用來聲明變量,同 var 一樣;
let a = 123;
console.log(a) //輸出123
* let 和 var 的區別:
{
var a = 123;
console.log(a) //輸出123
let b = 456;
console.log(b) //輸出456
}
console.log(a); //輸出123
console.log(b); //報錯
區別1:var 具有全有作用域和局部作用域,而 let 具備塊級作用域,也就是只有在代碼塊內才能進行輸出,比如{ },if,for....
console.log(a) //輸出undefined
var a = 123;
console.log(b); //報錯
let b = 123;
區別2:var 是具有變量聲明提升的,而 let 不允許變量聲明提升;
var a = 10;
var a = 123;
console.log(a) //輸出123,就近原則
let b = 10;
let b = 123;
console.log(b) //直接報錯
區別3:var 是可以重複聲明的,而 let 不允許重複聲明;
//舉一個例子:點擊以下每個li中的數字,讓控制檯輸出其對應的數字,HTML代碼如下:
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
//JavaScript代碼如下:
var lis = document.getElementsByTagName("li")
for(var i = 0;i < lis.length;i ++){
(function(i){
lis[i].onclick = function(){
console.log(i)
}
})(i)
}
//注:如果不使用立即執行函數,控制檯只會輸出一個5
//當將 var 換成是 let 時
for(let i = 0;i < lis.length;i ++){
lis[i].onclick = function(){
console.log(i)
}
}
//此時控制檯就會正確輸出對應的數字,因爲使用let以後,循環體內部形成了各自單獨的作用域
(2)const:聲明一個只讀的常量,一旦聲明,常量的值就不能改變;並且聲明之後,必須要賦值;
const A = 123; //人爲規範:常量名全部使用大寫
A = 456;
console.log(A) //直接報錯
const 也是隻在聲明所在的塊級作用域中才有效,同時也不允許聲明提升和聲明重複;
(3)字符串模板:
在ES6以前,只能通過 "字符串" + 變量 + " 字符串" 來進行字符串的拼接過程,並且不能直接換行,若要換行必須要加 \ (反斜槓)進行換行,大大的增加了代碼量,而且容易出錯;
在ES6中,是將變量放在${ }中,和字符串進行拼接,並且可以直接進行換行,書寫格式:` 字符串${變量} ` ;注意是 ` 符號;
//ES6以前
ar a = 123;
console.log('hello' + a)
//ES6中
let a = 123;
console.log(`hello${a}`) //二者輸出結果一樣
(4)字符串中的一些方法:
includes:判斷字符串中是否含有該字符,若有,返回true,反之返回false;
var a = "hello";
console.log(a.includes("a")) //輸出true
repeat:獲取字符串並可以進行重複n次:
var b = "ha";
console.log(b.repeat(3)) //輸出hahaha
startsWith 和 endsWith :判斷字符是否在字符串的頭部和末尾,返回布爾值:
var a = "hello world!";
console.log(a.startsWith('h')); //true
console.log(a.endsWith('!')) // true
(5)數組的一些擴展方法:
先來看一下ES6以前的數組的複製,克隆:
var arr = [1,2,3];
var arr1 = arr;
console.log(arr == arr1) //true
//二者之間進行比較,比較的是地址
arr1[0] = 5; //將arr1中內容發生改變
console.log(arr == arr1) //true
console.log(arr,arr1) //二者都輸出523
//不管怎麼改變,它們的地址始終不會變,並且arr的值會根據arr1的改變而改變
var arr2 = [];
console.log(arr == arr2) //false
//只有爲引用值時才能產生一個新的地址,也就是重新創建一個數組
for(var i = 0;i < arr.length;i ++){
arr2.push(arr[i]); //將arr中的值添加到arr2中
}
console.log(arr2) //523
arr2[0] = 2; //進行arr2的值的改變
console.log(arr,arr2) //輸出523 和 223
//這是數組的深度克隆,前者不會因爲後者的改變而改變
再來看ES6中的數組的克隆:
//第一種 Array.form方法
var arr = [1,2,3];
var arr1 = Array.from(arr);
console.log(arr,arr1); //結果相同,但地址不同
console.log(arr == arr1) //false
//第二種:數組的超引用
var arr2 = [...arr];
console.log(arr == arr2); //false
ES6以前,類數組想要擁有數組中方法必須要加 Array.prototype....方法:
function str(){
console.log(arguments); //arguments是獲取所有形參,它本身就是一個類數組
arguments.push = Array.prototype.push; //添加數組中push方法
arguments.push(5);
console.log(arguments) //添加成功
}
str(1,2,3,4)
在ES6中,簡化了代碼,並且直接以數組的形式輸出出來;
function str(...age){ //名字隨便定義,相當於獲取了所有的形參
console.log(age); //[1,2,3,4]
age.push(5); //直接使用數組中的方法
console.log(age) //[1,2,3,4,5]
}
str(1,2,3,4)