帶你總結ES6的特性

塵年往沙發表於2018-08-12

走進Es6

帶你總結ES6的特性

ES6(又名 ES2105)是 JavaScript 語言的新標準,2015 年 6 月正式釋出後,得到了迅速推廣,是目前業界超級活躍的計算機語言。

《ES6標準入門(第2版)》為中級難度,適合對 JavaScript 語言或 ES5 已經有所瞭解的讀者,用來提高水平,瞭解這門語言的最新發展;也可當作參考手冊,查尋 ES6/ES7 新增的語法點

一.var,let與const

在ES6中新增了let,與const的宣告方式

let類似於var,但是使用let宣告變數,所宣告的變數不會提升,而且let可以劃分塊級作用域

1.1 let宣告的變數不會提升:

    console.log(a) //undefined
    var a=110;
    console.log(b)
    let b=120 // not defined
複製程式碼

執行見下圖:

帶你總結ES6的特性

1.2 let劃分塊級作用域:

    if(true){var a=11}
    console.log(a) // 11
    if(true){let b=22}
    console.log(b) // not define
複製程式碼

執行見下圖:

帶你總結ES6的特性

總所周知,在js中,if是不能劃分非同步程式碼的,但是let所在的{}中,卻劃分了塊級作用域

2.用const來宣告常量,宣告常量時必須賦值,常量不可修改

帶你總結ES6的特性

    const PI =3.14
    console.log(PI)
    PI =77
    console.log(PI)
複製程式碼

執行見下圖:

帶你總結ES6的特性

二.解構賦值

從陣列和物件中提取值,對變數進行賦值,這稱為解構賦值

ES6之前為變數賦值:

    var a=1;
    var b=2;
    var c=3;
    console.log(a,b,c) // 1,2,3
複製程式碼

2.1 陣列中的解構賦值

使用解構賦值:

    var [a,b,c] =[1,2,3]
    console.log(a,b,c) // 1,2,3
複製程式碼

解構賦值還可以新增預設值,以右邊為主,右邊沒有再看左邊

    var [a,b,c,d=7]=[1,2,3]
    var [aa=1,bb=1,cc=1,dd=7]=[1,2,3,9]

    console.log(a,b,c,d) //1 2 3 7 成功設定了d的預設值7。
    console.log(aa,bb,cc,dd) //1 2 3 9 雖然各個變數都有自己的預設值,但是解構賦值右邊有數值,以右邊的為主。
複製程式碼

2.2 物件中的解構賦值

解構不僅可以用於陣列,還可以用於物件

物件的解構和陣列有一個重要的不同。陣列的元素是按此排序的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。

    var {bar,foo} = {foo:"aaa",bar:"bbb"};
    console.log(foo) // aaa
    console.log(bar) // bbb

    var {baz} = {foo:"aaa",bar:"bbb"};
    console.log(baz) // undefined
複製程式碼

如果變數名與屬性名不一致,必須寫成這樣:

    var {foo:baz} = {foo:"aaa",bar:"bbb"};
    console.log(baz) // "aaa"

    let obj = {first:"hello",last:"world"};
    let {first:f,lats:l} = obj;
    console.log(f) // "hello"
    console.log(l) // "world"
複製程式碼

物件的解構賦值是內部機制,是先找到同名屬性,然後再賦給對應的變數。 真正被賦值的是後者,而不是前者。

三.陣列中新增的方法

3.1擴充套件運算子

ES6中新增了擴充套件運算子"...",主要作用為:合併陣列,複製陣列,將字串或類陣列轉為真陣列。

3.1.1 擴充套件運算子--合併陣列:

    var arra=[1,2]
    var arrb=[6,7]
    var arrab=[...arra,...arrb]
    console.log(arrab)
複製程式碼

執行見下圖:

帶你總結ES6的特性

3.1.2 擴充套件運算子--複製陣列:

    var arr1=[1,2,3,4]
    var arr2=[...arr1]

    console.log(arr2) // [ 1, 2, 3, 4 ]
    arr1[0] = 99
    console.log(arr1) // [ 99, 2, 3, 4 ]
    console.log(arr2) // [ 1, 2, 3, 4 ]
複製程式碼

3.1.3 擴充套件運算子--將字串或類陣列轉為真陣列:

    var str ="nihao" 
    var sp=[...str]
    console.log(sp) // [ 'n', 'i', 'h', 'a', 'o' ]
複製程式碼

3.2 map

逐一處理原陣列的元素,並返回一個新陣列

    var arr = [1,2,3]
    var map = arr.map (function(item,index,arr){
        item+=100;
        return item
    })
    console.log(arr) //[ 1, 2, 3 ]
    console.log(map2) //[ 101, 102, 103 ]
複製程式碼

.map (function(item,index,arr), 其中形參item,index,arr 分別代表這元素,索引,陣列

3.3 Array.from

Array.from 可以將類陣列轉化為真陣列

    <div></div>
    <script>
        var lis = document.getElementsByTagName("div");
        console.log(Array.isArray(lis)); //列印值是false
    
        var  xx =Array.from(lis);
        console.log(Array.isArray(xx)) // true
        console.log(Array.isArray(lis)); //列印值仍是false
       //對原類陣列無影響
    </script>
複製程式碼

3.4 join()

將陣列變成字串

    var arr1= [1,2,3,4];
    var sr =arr1.join();
    console.log(sr) // 1,2,3,4
    console.log(typeof sr) // string
    console.log(typeof arr1) // object
複製程式碼

3.5 reverse()

將陣列翻轉,會影響原來的陣列

    var arr=[1,"a","b",2];
    var lz = arr.reverse();
    console.log(lz) // [ 2, 'b', 'a', 1 ]
    console.log(arr) // [ 2, 'b', 'a', 1 ]
複製程式碼

3.6 slice()

擷取陣列中的一段元素,生成新陣列,對原陣列無影響

    var arr=[1,2,3,4,5,6,7]
    var sc = arr.slice(0,4)
    console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7 ]
    console.log(sc) // [ 1, 2, 3, 4 ]
複製程式碼

slice() 中的形參是左閉右開區間

3.7 filter()

過濾陣列中符合條件的元素

    var arr= [1,2,3,4,5]
    var filter = arr.filter(function(item){
        return item<3;
    })
    console.log(filter) // [ 1, 2 ]
複製程式碼

filter 中的形參 item 表示陣列中的元素,會過濾出符合條件的元素,不影響原陣列。

3.8 Array.of()

建立陣列,將一組值轉為陣列,對原來的值無影響。

// 建立陣列
    var arr1=Array.of(3)
    var arr2=Array.of("3");
    console.log(arr1, typeof arr1) // [ 3 ] 'object'
    console.log(arr2, typeof arr2) //[ '3' ] 'object'

// 轉為陣列
    var xx= 1;
    var newxx=Array.of(xx);
    console.log(xx, typeof xx); // 1 'number'
    console.log(newxx, typeof newxx); // [ 1 ] 'object'
複製程式碼

3.9 fill()

給陣列填充制定值

    let arr =new Array(5);
    arr.fill("!!");
    console.log(arr) // [ '!!', '!!', '!!', '!!', '!!' ]

//fill方法會覆蓋之前的元素
    let arr1= [1,2,3,45,6,7]
    arr1.fill("你好")
    console.log(arr1) // [ '你好', '你好', '你好', '你好', '你好', '你好' ]

//制定填充的位置 左閉右開區間
    let arr2 =new Array(7);
    arr2.fill("!",0,2)
    console.log(arr2) // [ '!', '!', <5 empty items> ]
複製程式碼

3.10 indexOf()

返回制定元素在陣列中首次出現的位置

    var arr=[3,3,3,3,"xxx","???",7]

    console.log(arr.indexOf(9)) // -1
    console.log(arr.indexOf(3)) // 0
    console.log(arr.indexOf("xxx")) // 4
複製程式碼

返回的是指定的字串值在字串中首次出現的位置(陣列中的索引)沒有則返回-1

四.箭頭函式

箭頭函式相當於匿名函式,並且簡化了函式定義。

箭頭函式寫法 function(){} 變為 ()=>

4.1 箭頭函式書寫舉例:

    var a =""
    var f= (x)=>{
        a =x
        console.log(a)
    }
    f(1)  // 1
複製程式碼

若形參只有一個,則可以省略形參左右的()

    var a =""
    var f= x=>{
        a =x
        console.log(a)
    }
    f(1)  // 1
複製程式碼

如果沒有形參,則必須加()

若箭頭函式函式體裡只有一句語句,則可以省略{},如下:

    var f=()=>console.log("你好")
    f() // 你好
複製程式碼

5.字串模板

使用ES6中新增的字串模板,可以更加使書寫程式碼變的更為方便,如下:

//傳統字串拼接
var name = '豆豆';
var age = 6;
console.log(name+"今年已經"+age+"歲啦")

// 字元模板的寫法
console.log(`${name}今年已經${age}歲了`)
複製程式碼

使用鍵盤“Esc”下面的反引號將內容包括,用${}將變數包括。

6.class相關知識

在之前的ES5中,我們常常使用構造器的方法去實現一個類的功能,現在我們在ES6中可以直接使用class去建立類

6.1 先看一下使用構造器實現類:

function NBACreate(name, age ,height){
        this.name = name,
        this.age =age,
        this.height =height;
    }
    NBACreate.prototype.say =function(){
        console.log(`我是${this.name},今年${this.age}歲了。`)
    }

    var x1 =new NBACreate("小明","22","171")
    console.log(x1)
    x1.say();
複製程式碼

執行如下:

帶你總結ES6的特性

6.2使用class建立類:

class NBACreate2{
        //class 中的屬性要寫入constructor中
        constructor(name,age,height){
            this.name =name,
            this.age =age,
            this.height =height;
        }
        say(){
            console.log(`我是${this.name},今年${this.age}歲了。`)
        }
    }

    var y1 =new NBACreate2("大明","27","187")
    console.log(y1);
    y1.say();
複製程式碼

執行如下:

帶你總結ES6的特性

6.3 class中還可以使用static編寫靜態方法

class abc{
    constructor(a,b){
        this.name =a;
        this.age =b
    }
    say(){
        return console.log("你好")
    }
    static nicai(){
        return  console.log("我是靜態方法")
    }
}
var x1 = new abc("wangcai","7");
console.log(x1)
x1.say();
// 呼叫靜態方法,只能用方法名.靜態方法
abc.nicai();
複製程式碼

執行如下:

帶你總結ES6的特性

6.4 class中可以通過extends繼承類

class NBACreate2 {
        //class 中的屬性要寫入constructor中
        constructor(name, age, height) {
            this.name = name,
                this.age = age,
                this.height = height;
        }
        say() {
            console.log(`我是${this.name},今年${this.age}歲了。`)
        }
    }

    class MVP extends NBACreate2 {
        constructor(name, age, height, year) {
            //使用super借用NBACreate2
            super(name, age, height)
            this.year = year
        }
        sayMVp(){
            console.log(`我是${this.name},我是${this.year}的mvp`)
        }
    }
    
    var y1 = new MVP("大明", "27", "187",18)
    console.log(y1);
    y1.say();
    y1.sayMVp();
複製程式碼

執行如下:

帶你總結ES6的特性

7.字串擴充套件

7.1 trim()

使用trim可以去除字串的空格

    var str= "  a  b  c  "
    var str2 ="xx"
    console.log(str,str2)
 // trim 左右空格都去掉
    console.log(str.trim(),str2)

//trimLeft 左邊空格去掉
    console.log(str.trimLeft(),str2)
    
//trimRight  右空格去掉
    console.log(str.trimRight(),str2)
複製程式碼

執行如下:

帶你總結ES6的特性

7.2 repeat()

repeat可以複製指定份數的字串並返回

    var str="你好+ "
    console.log(str.repeat(10))
複製程式碼

執行如下:

帶你總結ES6的特性

repea 中的引數就是所要複製的份數

7.3 includes() 與 startsWith()

.includes 可以判斷字串中是否有其中的值,有的話返回true,無則返回false

startsWith()和 includes()的作用類似,不同的是includes() 可以從字串的任意位置開始檢索,startsWith() 只能從字串的首位置開始檢索

7.3.1 includes()

    var str= " abc de"
    console.log(str.includes("a")) // true
    console.log(str.includes(" ab")) // true
    console.log(str.includes("c d")) // true
    console.log(str.includes("c dxx")) // false
複製程式碼

7.3.2 startsWith()

    var str= "abc de"
    console.log(str.startsWith("a")) // true
    console.log(str.startsWith("ab")) // true
    console.log(str.startsWith("bc")) // false 此處若用includes()方法,則返回true
    console.log(str.startsWith("dexx")) // false
複製程式碼

7.4 padStart(), padEnd()

padStart() 和 padEnd() 的作用都是填充字串直至字串長度達到設定值,不同的是 padStart() 是從首部開始填充,而 padEnd() 是從尾部開始填充

    var str="你好"
    console.log(str.padStart(9,"hi"))
    console.log(str.padEnd(9,"沙"))
複製程式碼

執行如下:

帶你總結ES6的特性

8. 物件中新增的方法

8.1 getOwnPropertyDescriptor()

getOwnPropertyDescriptor() 方法可以獲取一個物件中某個屬性的詳細資訊

<script>
    var a=1;
    console.log(Object.getOwnPropertyDescriptor(window,"a"))
</script>
複製程式碼

執行如下:

帶你總結ES6的特性

8.2 Object.defineProperty()

Object.defineProperty() 精細化設定一個物件的屬性,其中包含屬性是否可以刪除是否可以修改此屬性是否可以列舉,和設定屬性的值四部分組成

Object.defineProperty() 的設定格式: Object.defineProperty(物件名,“屬性名”,{內容})

8.2.1 configurable

configurable 設定屬性是否可以刪除,預設是ture(可以刪除)

    var obj ={abc:"123"}
    Object.defineProperty(obj,"abc",{
        configurable:false
    })
    delete obj.abc;
    console.log(obj.abc) // 123
複製程式碼

因為設定了 configurable:false 即使刪除abc也刪除不了。

8.2.2 writable

writable 設定屬性是否可以修改,預設值是ture(可以修改)

    var obj = {name : "豆豆"}
    console.log(obj.name) 
    obj.name="旺財"
    console.log(obj.name)
    Object.defineProperty(obj,"name",{
        writable:false
    })
    obj.name="貝貝"
    console.log(obj.name)
複製程式碼

執行如下:

帶你總結ES6的特性

obj.name初始值是“豆豆”,此時可以成功將於修改列印“旺財”,一但設定了 writable:false 則修改無效。

8.2.3 enumerable

enumerable 設定屬性是否可以列舉,預設是ture(可以列舉)

    var obj = {
        a: "1",
        b: "2",
        c: "3"
    }
    for( var item in obj){
        console.log(item)
    }
    Object.defineProperty(obj,"a",{
        enumerable:false
    })
    // 分割線
    console.log("----------------")
    for( item in obj){
        console.log(item)
    }
複製程式碼

執行如下:

帶你總結ES6的特性

在未設定 enumerable:false 時,可以列舉obj中的a屬性,設定 enumerable 後,無法列舉a屬性。

8.2.4 value

value 設定屬性的值,分為兩種情況,一種宣告物件時不宣告屬性,一種宣告物件時宣告屬性。

8.2.4.1 宣告物件時不宣告屬性
    var obj ={
    }
    console.log(obj.abc) // 列印 obj.abc undefined
    Object.defineProperty(obj,"abc",{
        value:"你好"
    })
    console.log(obj.abc) // 列印發現obj.abc的值為value設定的值。
    obj.abc ="123"
    console.log(obj.abc) // 在外部無法再修改obj.abc的值了

    delete obj.abc
    console.log(obj.abc) // 也無法刪除其值
複製程式碼

執行如下:

帶你總結ES6的特性

此時 valu既保證屬性不可修改,還設定了屬性的值,即使在外部設定屬性的值,屬性的值仍然會被修改成value設定的值相同,並且設定value後,該屬性的值無法被刪除。

8.2.4.1 宣告物件時宣告屬性
    var obj ={
        abc:"xxxx"
    }
    console.log(obj.abc) // 列印 obj.abc xxxx
    Object.defineProperty(obj,"abc",{
        value:"你好"
    })
    console.log(obj.abc) // 列印發現obj.abc的值被value修改了
    obj.abc ="123"
    console.log(obj.abc) // 宣告屬性後,此時在外部可以再修改obj.abc的值
    delete obj.abc
    console.log(obj.abc) // 也可以刪除其值
複製程式碼

執行如下:

帶你總結ES6的特性

8.2.3 getOwnPropertyNames()

getOwnPropertyNames() 獲取自有屬性,以陣列的格式返回

var obj ={
        name:"xiaoming",
        age:"22",
        say:function(){
            console.log("我是obj裡面的say方法")
        }
    }
    console.log(obj);
    console.log(Object.getOwnPropertyNames(obj))  
複製程式碼

結語

此文總結的只是ES6的一部分特性,在以後的日子裡,會逐漸的去補充。

相關文章