ES6常用知識總結

前言

ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個版本標準,2015.06 發版。使用ES6語法可以大大的減少JS代碼,弊端是瀏覽器并不識別ES6語法,主流瀏覽器一般都是將ES6語法轉為ES5語法。本編文章講解的都是一些工作中常用到的知識點,并不包含所有知識點。

ES6

demo地址: https://github.com/pengjunshan/WebPJS/ES6

其它Web文章
CSS浮動的使用和解決浮動的五種方法
CSS定位relative、absolute、fixed使用總結
原生開發WebApi知識點總結
開發中常用jQuery知識點總結
C3動畫+H5+Flex布局使用總結
Vue學習知識點總結
開發環境到生產環境配置webpack
待續......

本編文章會講到的知識點

  • 變量聲明let、const
  • 箭頭函數
  • 解構賦值
  • 字符串擴展
  • 函數默認參數
  • 對象的擴展
  • 擴展運算符
  • ES6遍歷數組
  • ES6遍歷對象
  • import和export
變量聲明let、const

ES6 新增了let命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內有效。

特點
1.塊級作用域;
2.先聲明再使用;
3.在同作用域中不能重復聲明;
4.聲明了但沒有賦值,值是undefined

    let num = 2;
        let mm;//undefined
        {
            let num = 3;
            // let num = 4;//再次聲明會報錯,提示已經聲明過num了
            console.log(num)//3
        }
        console.log(num)//2

        for (var i = 0; i < 10; i++) {
        }
        //i被變量提升了成為了全局變量
        console.log(i)//10

        for (let j = 0; j < 10; j++) {
        }
        // console.log(j)//報錯找不到j,因為j是局部變量出了for循環就找不到j了

const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。const的作用域與let命令相同:只在聲明所在的塊級作用域內有效;

特點
1.聲明必須賦值,否則報錯;
2.一旦聲明,值不可以變;
3.可以更改對象中屬性的值

        const name = '鄧紫棋'
        // const sex;//報錯,提示常量聲明缺少初始值
        console.log(name)
        // name = '張韶涵'//報錯,常量不能改值

        //可以改變對象中的屬性的值
        const user = {name:'張萌萌'}
        user.name = '關曉彤'
        console.log(user.name)
箭頭函數

特點
1.箭頭函數里沒有this,如果要用this就是父級的this 如果父級也沒有this 那么就繼續往上找 直到找到window
2.無法使用arguments,沒有arguments對象
3.不需要 function 關鍵字來創建函數
4.不要在Vue的選項屬性或回調上使用箭頭函數
5.相當于java中的lamda表達式

//使用一:沒有入參,函數內就一行
        let aa1 = function(){
            return 1;
        }
        //轉箭頭函數,可以省略return和{}
        let aa2 = ()=> 1;

        //使用二:有入參,函數內就一行
        let bb1 = function(num){
            return num+1;
        }
        //轉箭頭函數,可以省略return和{}
        let bb2 = num=> num+1;

        //使用三:有多個入參,函數內有多行
        let cc1 = function(pp,jj){
            pp = pp+'你好';
            return jj+'你好'
        }
        //轉箭頭函數,多個參數時用()包含著,
        let cc2 = (pp,jj)=>{
            pp = pp+'你好';
            return jj+'你好'
        }
        console.log(cc2('aa','鄧紫棋'));//鄧紫棋你好
解構賦值

ES6 允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(Destructuring)。

數組解構

      let arr = [1,2,3];
      let [a,b,c] = arr;
      console.log(""+a+b+c)

對象解構

        let obj = {name:'鄧紫棋',sex:'女'}
        //賦給對應的字段名
        let {name,sex} = obj
        console.log(name+sex)
        //賦給對應字段的變量,如果發現對應的字段名已經存在了可以用這種方式解構
        let {name:x,sex:y} = obj
        console.log(x+y)

在函數參數中使用解構

        let obj = {name:'鄧紫棋',sex:'女'}
        let fn =function({name,sex}){
            console.log(name+sex)
        }
        //箭頭函數+對象解構
        let fn1 = ({name,sex})=> console.log(name+sex+'fn1')
        fn(obj)
        fn1(obj)
字符串擴展

自從ES6出了``字符串模板標記后,再也不用雙引號拼接字符串了。如果模板中有需要插入變量值使用${變量名}來界定;


        //上篇文章中組件就使用了字符串模板
        const template = `
            <div>
                <p>你好!</p>
                <p>鄧紫棋</p>
            </div>
        `
        console.log(template)

        //將表達式嵌入字符串中進行拼接。用${}來界定
        let name = '鄧紫棋'
        console.log(`我愛你${name}`)
函數默認參數

ES6為參數提供了默認值。在定義函數時便初始化了這個參數,以便在參數沒有被傳遞進去時使用。

        //如果傳參了就是傳參的值,如果沒有傳參默認為6
        let fn = function(num=6){
            console.log(num)
        }
        fn();//沒有傳值默認6
        fn(8);//傳了值8 num值就是8
對象的擴展

經常遇到key:value形式,把key和value命名都一樣的話可以省略:value

        //鍵值對重名
        let fn = function (name, age) {
            return {
                name: name,
                age: age
            }
        }
        //簡化 鍵值命名一樣
        let fn1 = function (name, age) {
            return {
                name,
                age
            }
        }

ES6 同樣改進了為對象字面量方法賦值的語法

        let obj = {
            fn: function () {
                console.log(111111)
            }
        }

        //省略function關鍵字
        let obj1 = {
            fn() {
                console.log(222222)
            },
        }
        obj.fn();
        obj1.fn();
// Object.keys(obj):獲取對象的所有key形成的數組
// Object.values(obj):獲取對象的所有value形成的數組
// Object.entries(obj):獲取對象的所有key和value形成的二維數組。格式:[[k1,v1],[k2,v2],…]
// Object.assign(dest, …src) :將多個src對象的值 拷貝到 dest中(淺拷貝)。
擴展運算符

ES6中另外一個好玩的特性就是Spread Operator 也是三個點兒..., 它可以是數組也可以是對象,可以很好的把兩個數組或者兩個對象合并在一起;

數組
在一個數組中添加元素返回一個新數組,不會除重

        //數組,在一個數組中添加元素返回一個新數組,不會除重
        let arr = [1,2,3,4,5]
        let arr1 = [...arr,6,7,8,9,5]
        console.log(arr1)//[1,2,3,4,5,6,7,8,9,5]

        //兩個數組合并不會除重
        let arr2 = [1,2,3,4,5]
        let arr3 = [1,2,3,4,5]
        console.log([...arr2,...arr3])//[1,2,3,4,5,1,2,3,4,5]

對象
1.在老對象中新增屬性返回一個新的對象;
2.兩個對象合并,后面對象會覆蓋前面重復的屬性

        //對象,在老對象中新增屬性返回一個新的對象
        let obj = {
            name:'鄧紫棋',
            age:18
        }
        let obj1 = {...obj,sex:'女'}
        console.log(obj1)

        //兩個對象合并,后面對象會覆蓋前面重復的屬性
        let obj2 = {
            name:'鄧紫棋',
            age:18
        }
        let obj3 = {
            name:'鄧紫棋',
            age:19,
            sex:'女'
        }
        let obj4= {...obj2,...obj3}
        console.log(obj4)

函數中使用

        let fn = function(...n){
            console.log(n)
        }
        fn(1,2,3)//[1,2,3]
ES6遍歷數組
map

map()方法,map常用在修改item中屬性的值,不會改變數組的長度。

  • 如果數組是值類型的,不會改變老的數組中的值;
  • 如果數組的類型是對象,會改變老的數組中的值;
  • item:當前元素; index:當前元素的下標;arr:當前操作的數組
        //值類型數組
        let arrNum = [1, 2, 3, 4, 5, 6]
        //對象類型數組
        let arrObj = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]

        //如果數組是值類型的,不會改變老的數組中的值
        let mapArrNum = arrNum.map((item,index,arr) => {
            return item * 2
        })
        console.log('arrNum老的數組', arrNum)//[1, 2, 3, 4, 5, 6]
        console.log('mapArrNum新的數組', mapArrNum)//[2, 4, 6, 8, 10, 12]

        //如果數組的類型是對象,會改變老的數組中的值
        //item:當前元素; index:當前元素的下標;arr:當前操作的數組
        // let mapArrObj = arrObj.map((item,index,arr)=>{
        let mapArrObj = arrObj.map((item) => {
            if (item.id === 3) {
                item.age = 20
            }
            return item;
        })
        console.log('arrObj老的數組', arrObj)//{ id: 3, name: '周芷若', age: 20 }
        console.log('mapArrObj新的數組', mapArrObj)//{ id: 3, name: '周芷若', age: 20 }
filter
  • filter()方法,用來過濾數組,返回一個新的數組;
  • filter方法需要在循環的時候判斷一下是true還是false,是true才會返回這個元素然后加入到新的數組中;
        let filterArrObj = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]
        let filterArr = filterArrObj.filter((item, index, arr) => {
            return item.age >= 18;
        })
        console.log('age大于等于18的人', filterArr)//{id:1...}{id:2...}
forEach
  • forEach()方法,沒有返回值,map()、filter()都會返回一個新數組;
  • forEach遍歷方式遍歷數組全部元素,利用回調函數對數組進行操作,自動遍歷數組.length次;
  • 且無法break中途跳出循環,不可控、不支持return操作輸出,return只用于控制循環是否跳出當前循環;
        let eachArrObj = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]
        eachArrObj.forEach((item,index,arr)=>{
            item.age>18? item.age=18:item.age=item.age
        })
        console.log('forEach遍歷后:',eachArrObj)//{id:1,age:18}{id:2,age:18}{id:3,age:16}
every
  • every()方法,循環遍歷數組,返回一個布爾值;
  • 對數組中的每一項運行給定函數,如果該函數對每一項返回true,則最后返回true。否則返回false;
        let arrObjTow = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]
        let isEvery = arrObjTow.every((item,index,arr)=>{
            return item.age>18
        })
        console.log('every,age是否全部大于18:',isEvery)//false
some
  • some()方法,循環遍歷數組,返回一個布爾值;
  • 對數組中的每一項運行給定函數,如果該函數中任一項返回true,則最后返回true;
        let isSome = arrObjTow.some((item,index,arr)=>{
            return item.age>18
        })
        console.log('some(),age有大于18的嗎:',isSome)//true
for…in
  • for…in;是用于遍歷包含鍵值對(key-value)的對象,對數組并不是那么友好;
  • 通過arr[key]獲取當前元素,key:下標;
        let arrObjTow = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]
        for(let key in arrObjTow){
            console.log('for...in:',arrObjTow[key])//{id:*,name:*,age:*}
        }
for...of
  • for...of;是ES6定義的新的遍歷數組的方法,直接獲取值
        let arrObjTow = [
            { id: 1, name: '鄧紫棋', age: 18 },
            { id: 2, name: '高圓圓', age: 19 },
            { id: 3, name: '周芷若', age: 16 },
        ]
        for(let val of arrObjTow){ 
            console.log('for...of:',val)//{id:*,name:*,age:*}
        }
ES6遍歷對象
for...in
  • for...in;循環遍歷對象自身的和繼承的可枚舉屬性;
  • 通過obj[key]獲取值,key:屬性名稱;
        let obj = {id: 1, name: '鄧紫棋', age: 18}
        for(let key in obj){
            console.log(key+'--'+obj[key])//id--1  name--鄧紫棋  age--18
        }
Object.keys(obj)
  • Object.keys(obj);獲取對象中的key,組成一個數組
Object.keys(obj).forEach(key=>console.log(key+'--'+obj[key]))
import和export
導入第三方庫、插件
  • import引入一個依賴包,不需要相對路徑
import vue from 'vue'
import axios from 'axios'
  • import引入css、less、sass
import './index.css'
import './a.less'
export{}
  • 使用export{}拋出的變量,一個文件里可以多個export;
  • 可以導出多個變量, 當使用導出變量時, 需要了解導出變量原來的命名;
    A.js導出
const name = '鄧紫棋'
function fn() {}
function getName() {
    return name
}
export { name, getName }
//給fn另起個名字 as后面的值就是新名字
export { fn as fnn }

B.js導入

// 導入1 B.js導入,用{}分別接收每個變量和方法
import {name,fnn,getName} from 'A.js'
console.log(name)
console.log(fn())
//導入2 B.js導入,一次性導入整個類
import * as utils from 'A.js'
console.log(utils.name)
console.log(utils.getName())
export default{}
  • 使用export default{}拋出,一個文件里只能有一個export default;
  • 默認無法同時導出多個變量;
  • 導出變量的方式非常優雅, 當使用導出變量時, 無需了解導出變量原來的命名;
// A.js導出
function getAge(){return 18}
export default{ getAge }

// B.js接收導入 接收export導出的數據需要用{}接收,接收export default導出的數據不需要用{}接收并且接收名字可以更改
import getAge from 'A.js'
export 和 export default的區別

1.export
import {getCurrTime} from './util'; //需要加花括號 可以一次導入一個也可以一次導入多個,但都要加括號
如果是兩個方法,import {getCurrTime,post} from './util';

2.export default
import utils from './util'; //不需要加花括號 只能一個一個導入
export default有單次限制,只能使用export default向外暴露一次

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,803評論 0 1
  • 以下內容是我在學習和研究ES6時,對ES6的特性、重點和注意事項的提取、精練和總結,可以做為ES6特性的字典;在本...
    科研者閱讀 3,141評論 2 9
  • ES6簡介 ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經在 2...
    凌雨微塵閱讀 1,097評論 0 3
  • 第一章:塊級作用域綁定 塊級聲明 1.var聲明及變量提升機制:在函數作用域或者全局作用域中通過關鍵字var聲明的...
    BeADre_wang閱讀 849評論 0 0
  • 1、新的聲明方式 以前我們在聲明時只有一種方法,就是使用var來進行聲明,ES6對聲明的進行了擴展,現在可以有三種...
    令武閱讀 1,016評論 0 7