ES6

let變量聲明及聲明特性

let a;
let b,c,d;
特性:
1.變量不能重復(fù)聲明
2.塊級(jí)作用域 全局 函數(shù) eval

if else  while  for
{
  let girl = '張一'
}
console.log(girl) //報(bào)錯(cuò)   girl is nod defined

3.不存在變量提升
4.不影響作用域鏈

const聲明常量及其特點(diǎn)

const SCHOOL = '學(xué)校'
特點(diǎn):
1.一定要賦初始值
2.一般常量使用大寫(潛規(guī)則)
3.常量的值不能修改
4.塊級(jí)作用域
5.對(duì)于數(shù)組和對(duì)象的元素修改,不算做對(duì)常量的修改蜻牢,不會(huì)報(bào)錯(cuò)

變量的解構(gòu)賦值

ES6 允許按照一定模式從數(shù)組和對(duì)象中提取值消返,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)賦值
1.數(shù)組的解構(gòu)

[a,b,c] = [1,2,3]
console.log(a,b,c)

2.對(duì)象的解構(gòu)

let person = {
       name:'張三',
       age:18
}
let {name,age} = person
 console.log(name,age)

模板字符串

ES6引入新的聲明字符串的方式 ``
let str = haha
特性
1.內(nèi)容中可以直接出現(xiàn)換行符

 let str = `<ul>
                      <li>111</li>
                      <li>222</li>
                   </ul>`

2.變量拼接
let name = '張三'
console.log(我的名字是${name})

對(duì)象的簡(jiǎn)化寫法

ES6允許在大括號(hào)里面祝迂,直接寫入變量和函數(shù),作為對(duì)象的屬性和方法
這樣的書寫更加簡(jiǎn)潔

        let name = '尚硅谷'
        let change = function(){
            console.log('change')
        }
        let person = {
            name,
            change,
            //函數(shù)簡(jiǎn)寫
            improve(){
                console.log('improve')
            }
        }
        console.log(person)

箭頭函數(shù)以及聲明特點(diǎn)

        let fn = (a,b) => {
            return a+b
        }
        console.log(fn(1,2))

特點(diǎn):
1.this是靜態(tài)的器净,this始終指向函數(shù)聲明時(shí)所在的作用域下的this的值

2.不能作為構(gòu)造實(shí)例化對(duì)象
不能用new
3.不能使用arguments變量
4.箭頭函數(shù)的簡(jiǎn)寫

//省略小括號(hào)
       let add = n => {
            return n+n
        }
//省略花括號(hào)
        let pow = (n) => n*n

箭頭函數(shù)適合與this無關(guān)的回調(diào)型雳,定時(shí)器,數(shù)組的方法回調(diào)
箭頭函數(shù)不適合與this有關(guān)的回調(diào)山害,事件回調(diào)纠俭,對(duì)象的方法

rest參數(shù)

ES6引入rest參數(shù),用于獲取函數(shù)的實(shí)參浪慌,用來代替arguments
rest參數(shù)必須要放到最后

        function fn(a,b,...args){
            console.log(args)  //[3,4,5]
        }
        fn(1,2,3,4,5)

擴(kuò)展運(yùn)算符

...

//數(shù)組的合并
        const arr1 = [1,2]
        const arr2 = [3,4]
        const arr = [...arr1,...arr2]
        console.log(arr)
//數(shù)組的克隆
        const arr3 = ['E','G','M']
        const arr4 = [...arr3]
        console.log(arr4)
//將偽數(shù)組轉(zhuǎn)為真正的數(shù)組
        const divs = document.querySelectorAll('div')
        const divArr = [...divs]
        console.log(divArr)

Symbol的介紹與創(chuàng)建

ES6 引入了一種新的原始數(shù)據(jù)類型 Symbol,表示獨(dú)一無二的值冤荆。它是JavaScript 語言的第七種數(shù)據(jù)類型,是一種類似于字符串的數(shù)據(jù)類型。
Symbol 特點(diǎn)

  1. Symbol的值是唯一的,用來解決命名沖突的問題
  2. Jymbol值不能與其他數(shù)據(jù)進(jìn)行運(yùn)算
  3. Symbol 定義的對(duì)象屬性不能使用 for ... in 循環(huán)遍歷,但是可以使用Reflect.ownKeys 來獲取對(duì)象的所有鍵名

對(duì)象添加Symbol類型的屬性

        let game = {
            up(){
                console.log('up')
            },
            down(){
                console.log('down')
            }
        }
        let methods = {
            up:Symbol(),
            down:Symbol()
        }
        game[methods.up] = function(){
            console.log('new up')
        }
        game[methods.down] = function(){
            console.log('new down')
        }

        console.log(game)


        let person = {
            name:'張三',
            [Symbol('say')]:function(){
                console.log('say')
            }
        }
        console.log(person)

迭代器

迭代器(Iterator)是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制权纤。
任何數(shù)據(jù)結(jié)構(gòu)只要部署 Iterator 接口,就可以完成遍歷操作钓简。

  1. ES6創(chuàng)造了一種新的遍歷命令for ... of循環(huán),Iterator 接口主要供for ... of消費(fèi)
  2. 原生具備 iteiator接口的數(shù)據(jù)(可用for of 遍歷)
    a) Array
    b) Arguments
    c) Set
    d) Map
    e)String
    f)TypedArray
    g) NodeList
  3. 工作原理
    a)創(chuàng)建一個(gè)指針對(duì)象,指向當(dāng)前數(shù)據(jù)結(jié)構(gòu)的起始位置
    b)第一次調(diào)用對(duì)象的next方法,指針自動(dòng)指向數(shù)據(jù)結(jié)構(gòu)的第一個(gè)成員
    c) 接下來不斷調(diào)用next方法,指針一直往后移動(dòng),直到指向最后一個(gè)成員
    d)每調(diào)用next方法返回一個(gè)包含value和done屬性的對(duì)象
    注:需要自定義遍歷數(shù)據(jù)的時(shí)候乌妒,要想到迭代器
解決回調(diào)地獄問題
        function one(){
            setTimeout(()=>{
                console.log(111)
                iterator.next()
            },1000)
        }
        function two(){
            setTimeout(()=>{
                console.log(222)
                iterator.next()
            },2000)
        }
        function three(){
            setTimeout(()=>{
                console.log(333)
                iterator.next()
            },3000)
        }

        function * gen(){
            yield one()
            yield two()
            yield three()
        }
        //調(diào)用生成器函數(shù)
        let iterator = gen()
        iterator.next()

Promise

Promise是ES6引入的異步編程的新解決方案。語法上Promise是一個(gè)構(gòu)造函數(shù),
用來封裝異步操作并可以獲取其成功或失敗的結(jié)果外邓。

  1. Promise 構(gòu)造函數(shù):Promise(excutor)份
  2. Promise.prototype.then 方法
  3. Promise.prototype.catch 方法
        const p = new Promise((resolve,reject)=>{
          setTimeout(()=>{
            let data = '數(shù)據(jù)讀取成功'
            resolve(data)

            // let error = '數(shù)據(jù)讀取失敗'
            // reject(error)
          },1000)
        })

        p.then(function(value){
            console.log(value)
        },function(reason){
            console.error(reason)
        })

Promise封裝AJAX請(qǐng)求

        const p = new Promise((resolve,reject)=>{
            const xhr =new XMLHttpRequest()
            xhr.open('GET','http://jsonplaceholder.typicode.com/posts')
            xhr.send()
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >=200 && xhr.status < 300){
                        resolve(xhr.response)
                    }else{
                        reject(xhr.response)
                    }
                }
            }

        })
        p.then(function(value){
            console.log(value)
        },function(reason){
            console.error(reason)
        })

Set 集合介紹與API

        let s = new Set()
        let s2 = new Set([1,2,2,3,4,5,5,])   //自動(dòng)去重

        //元素個(gè)數(shù)
        console.log(s2.size)

        //添加新的元素
        s2.add('new')

        //刪除元素
        s2.delete('new')

        //檢測(cè)
        console.log(s2.has(2))

        //清空
        // s2.clear()

        console.log(s2)

        for( let v of s2){
            console.log(v)
        }
        

集合實(shí)踐

        let arr = [1,2,3,4,5,4,3,2,1]

        //1.數(shù)組去重
        let newArr = [...new Set(arr)]
        console.log(newArr)

        //2.交集
        let arr2 = [4,5,6,5,6]
        let result = [...new Set(arr)].filter(item => new Set(arr2).has(item))
        console.log(result)

        //3.并集
        let result2 =[...new Set( [...arr,...arr2])]
        console.log(result2)
        //4.差集
        let chaArr = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)))
        let chaArr2 = [...new Set(arr2)].filter(item => !(new Set(arr).has(item)))
        console.log(chaArr,chaArr2)

Map

ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)撤蚊。它類似于對(duì)象,也是鍵值對(duì)的集合。但是“鍵”的范圍不限于字符串,各種類型的值(包括對(duì)象),都可以當(dāng)作鍵损话。Map也實(shí)現(xiàn)了 iterator 接口,所以可以使用「擴(kuò)展運(yùn)算符』和【for ... of .... 』進(jìn)行遍歷侦啸。Map的屬性和方法:

  1. size 返回Map的元素個(gè)數(shù)|
  2. set 增加一個(gè)新元素,返回當(dāng)前Map
  3. get 返回鍵名對(duì)象的鍵值
  4. has 檢測(cè)Map中是否包含某個(gè)元素,返回boolean 值
  5. clear 清空集合,返回 undefined
        let m = new Map()
        m.set('name','尚硅谷')
        m.set('age',18)
        m.set([1,2,3],{a:1,b:2})
        console.log(m.get('age'))
        console.log(m.has('age'))
        // m.delete('age')
        // m.clear()

        console.log(m)
        console.log(m.size)

class介紹與初體驗(yàn)

ES6 提供了更接近傳統(tǒng)語言的寫法,引入了Class(類)這個(gè)概念,作為對(duì)象的模板。通過class關(guān)鍵字,可以定義類丧枪」馔浚基本上,ES6的class可以看作只是一個(gè)語法糖,它的絕大部分功能,ES5都可以做到,新的class 寫法只是讓對(duì)象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已豪诲。
知識(shí)點(diǎn):

  1. class 聲明類
  2. constructor 定義構(gòu)造函數(shù)初始化
  3. extends 繼承父類
  4. super 調(diào)用父級(jí)構(gòu)造方法
  5. static 定義靜態(tài)方法和屬性
  6. 父類方法可以重寫
        //ES5
        function Phone(brand,price){
            this.brand = brand
            this.price = price
        }
        Phone.prototype.call = function(){
            console.log('我可以打電話')
        }

        let xiaomi = new Phone('小米',4999)
        xiaomi.call()
        console.log(xiaomi)

          //ES6
        class Phone{
            //構(gòu)造方法 名字不能修改
            constructor(brand,price){
                this.brand = brand
                this.price = price
            }
            // 方法必須使用該語法顶捷,不能使用ES5的對(duì)象完整形式
            call(){
                console.log('我可以打電話')
            }
        }

        let HUAWEI = new Phone('華為',6999)
        HUAWEI.call()
        console.log(HUAWEI)

class的類繼承

        class SmartPhone extends Phone{
            constructor(brand,price,color){
                super(brand,price)
                this.color = color
            }
            photo(){
                console.log('我可以拍照')
            }
        }

        let oneplus = new SmartPhone('1+',4999,'白色')
        oneplus.photo()
        console.log(oneplus)

數(shù)值擴(kuò)展

Number.EPSILON
Number.isFinite 檢測(cè)一個(gè)數(shù)值是否為有限數(shù)
Number.isNaN 檢測(cè)一個(gè)數(shù)值是否為NaN
Number.parseInt 字符串轉(zhuǎn)整數(shù)
Number.parseFloat
Number.isInteger 判斷一個(gè)數(shù)是否為整數(shù)
Math.trunc 將數(shù)字的小鼠部分抹掉
Math.sign 判斷一個(gè)數(shù)到底為正數(shù) 負(fù)數(shù) 還是零

對(duì)象方法擴(kuò)展

Object.is 判斷兩個(gè)值是否完全相等
Object.assign 對(duì)象的合并
Object.setPrototypeOf 設(shè)置原型對(duì)象 Object.getPrototyeOf 獲取原型

        console.log(Object.is(120,120))

        const config1 = {
            host:'localhost',
            port:3306,
            name:'root',
            pass:'root',
            b:200
        }

        const config2 = {
            host:'http://atguigu.com',
            port:33060,
            name:'atguigu.com',
            pass:'iloveyou',
            a:100
        }
        console.log(Object.assign(config1,config2))

        const school = {
            name:'尚硅谷'
        }
        const cities = {
            xiaoqu :['北京']
        }
        Object.setPrototypeOf(school,cities)
        console.log(school)
        console.log(Object.getPrototypeOf(school))

ES6模塊暴露數(shù)據(jù)語法匯總

m1.js

//分別暴露
export let school = '尚硅谷1'
export function change(){
    console.log('m1')
}

m2.js

//統(tǒng)一暴露
let school = '尚硅谷2'
function findJob(){
    console.log('m2')
}
export {school,findJob}

m3.js

//默認(rèn)暴露
export default{
    school : '尚硅谷3',
    change(){
        console.log('m3')
    }
}

html

    <script type="module">

        //1.通用的導(dǎo)入方式
        //引入m1.js 模塊內(nèi)容
         import * as m1 from "./src/js/m1.js"
         import * as m2 from "./src/js/m2.js"
         import * as m3 from "./src/js/m3.js"
         console.log(m1)

        
        //2.解構(gòu)賦值的形式
         import {school,change} from './src/js/m1.js'
         import {school as guigu,findJob} from './src/js/m2.js'
         import {default as m3} from './src/js/m3.js'
         console.log(school,change,guigu,findJob)
         console.log(m3)

        //3.簡(jiǎn)便形式  針對(duì)默認(rèn)暴露
        import m3 from './src/js/m3.js'
        console.log(m3)

    </script>

瀏覽器使用ES6模塊化方式二

app.js

//入口文件

//模塊引入
import * as m1 from './m1.js'
import * as m2 from './m2.js'
import * as m3 from './m3.js'

console.log(m1,m2,m3)

html

   <script src="./src/js/app.js" type="module"></script>

ES7新特性

includes 之前用 indesOf

const arr =  [1,22,333,444]
console.log(arr.includes(1))

** 次方

        console.log(2 ** 3)
        console.log(Math.pow(2,3))

ES8新特性

async await

async和 await 兩種語法結(jié)合可以讓異步代碼像同步代碼一樣

async 函數(shù)

  1. async函數(shù)的返回值為 promise對(duì)象,
  2. promise 對(duì)象的結(jié)果由async函數(shù)執(zhí)行的返回值決定

await 表達(dá)式

1.await必須寫在async函數(shù)中
2.await 右側(cè)的表達(dá)式一般為promise對(duì)象
3.await返回的是promise成功的值
4.await的 promise失敗了,就會(huì)拋出異常,需要通過try ... catch捕獲處理

async 與 await 結(jié)合發(fā)送AJAX請(qǐng)求

        //發(fā)送AJAX請(qǐng)求,返回的結(jié)果是Promise對(duì)象
        function sendAJAX(url){
            return new Promise((resolve,rejcet)=>{
                const x = new XMLHttpRequest()
                x.open('GET',url)
                x.send()
                x.onreadystatechange = function(){
                    if(x.readyState === 4){
                        if(x.status >= 200 && x.status < 300){
                            resolve(x.response)
                        }else{
                            reject(x.status)
                        }
                    }
                }
            })    
        }

        //promise then方法測(cè)試
        // sendAJAX('http://jsonplaceholder.typicode.com/posts').then(value=> {
        //     console.log(value)
        // }, reason => {
        //     console.log(reason)
        // })

        //async await 測(cè)試
        async function main(){
            let result = await sendAJAX('http://jsonplaceholder.typicode.com/posts')
            let result2 = await sendAJAX('http://jsonplaceholder.typicode.com/posts/2')
            console.log(result2)
        }

        main()

ES8對(duì)象方法擴(kuò)展

Object.keys()
Object.values()
Object.entries()

const school = {
            name:'尚硅谷',
            cities:['北京','上海']
        }
        console.log(Object.keys(school))
        console.log(Object.values(school))
        console.log(Object.entries(school))
        const m = new Map(Object.entries(school))
        console.log(m.get('name'))

ES10 字符串方法擴(kuò)展

trimStart trimEnd

ES10 數(shù)組方法擴(kuò)展

flat 將多維數(shù)組轉(zhuǎn)化為低位數(shù)組
flatMap

       const arr1 = [1,2,3,4,[5,6,[7,8]]]

        //參數(shù)為深度 是一個(gè)數(shù)字
        console.log(arr1.flat(2))

        const arr2 = [1,2,3,4]
        const result = arr2.flatMap(item => [item * 10])
        console.log(result)

ES10 Symbol.prototype.description

        let s = Symbol('尚硅谷')
        console.log(s.description)

ES11 私有屬性

        class Person {
            //公有屬性
            name;
            //私有屬性
            #age;
            #weight;
            constructor(name, age, weight){
                this.name = name
                this.#age = age
                this.#weight = weight
            }
        }

        const girl = new Person('小紅', 18, '45kg')
        console.log(girl)
        console.log(girl.#age)  //報(bào)錯(cuò)

ES11 Promise.allSettled

       const p1 = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve('商品數(shù)據(jù) - 1')
            },1000)
        })

        const p2 = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve('商品數(shù)據(jù) - 2')
            },1000)
        })

        const result = Promise.allSettled([p1,p2])
        // const result = Promise.all([p1,p2])  //兩個(gè)任務(wù)必須都成功
        result.then(value => {
            console.log(value)
        },reason => {
            console.log(reason)
        })

        console.log(result)

ES11 動(dòng)態(tài)import

//import * as m1 from './hello.js'
import('./hello.js').then(module => {
  module.hello()
})

ES11 BigInt類型

        //大整形
        let n = 521n;
        console.log(n, typeof(n))

        //函數(shù)
        let n2 = 123;
        console.log(BigInt(n2))
        // console.log(BigInt(1.2))  //報(bào)錯(cuò)

        //大數(shù)值運(yùn)算
        let max = Number.MAX_SAFE_INTEGER
        console.log(BigInt(max) + BigInt(1))
        console.log(BigInt(max) + BigInt(2))

ES11 絕對(duì)全局對(duì)象globalThis

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屎篱,一起剝皮案震驚了整個(gè)濱河市服赎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌交播,老刑警劉巖重虑,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秦士,居然都是意外死亡缺厉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門隧土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來提针,“玉大人,你說我怎么就攤上這事曹傀》保” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵皆愉,是天一觀的道長(zhǎng)嗜价。 經(jīng)常有香客問我,道長(zhǎng)幕庐,這世上最難降的妖魔是什么久锥? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮异剥,結(jié)果婚禮上瑟由,老公的妹妹穿的比我還像新娘。我一直安慰自己冤寿,他們只是感情好歹苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布绿鸣。 她就那樣靜靜地躺著,像睡著了一般暂氯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亮蛔,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天痴施,我揣著相機(jī)與錄音,去河邊找鬼究流。 笑死辣吃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芬探。 我是一名探鬼主播神得,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼偷仿!你這毒婦竟也來了哩簿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤酝静,失蹤者是張志新(化名)和其女友劉穎节榜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體别智,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宗苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薄榛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讳窟。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敞恋,靈堂內(nèi)的尸體忽然破棺而出丽啡,到底是詐尸還是另有隱情,我是刑警寧澤耳舅,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布碌上,位于F島的核電站,受9級(jí)特大地震影響浦徊,放射性物質(zhì)發(fā)生泄漏馏予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一盔性、第九天 我趴在偏房一處隱蔽的房頂上張望霞丧。 院中可真熱鬧,春花似錦冕香、人聲如沸蛹尝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽突那。三九已至挫酿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愕难,已是汗流浹背早龟。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猫缭,地道東北人葱弟。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猜丹,于是被迫代替她去往敵國(guó)和親芝加。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容