2.1. let關鍵字
let關鍵字用來聲明變量,使用 let聲明的變量有幾個特點:
不允許重復聲明
塊兒級作用域
不存在變量提升
不影響作用域鏈
應用場景:以后聲明變量使用let就對了 案例:點擊切換顏色
< ! DOCTYPE html
>
< html
> < head
> < meta charset
= "utf-8" > < title
> < / title
> < style type
= "text/css" > . container
{ width
: 500 px
; margin
: 0 auto
; } . box
{ display
: flex
; } . item
{ width
: 100 px
; height
: 45 px
; border
: 1 px solid deepskyblue
; margin
- right
: 10 px
; } < / style
> < / head
> < body
> < div
class = "container" > < h2
> 點擊切換顏色
< / h2
> < div
class = "box" > < div
class = "item" > < / div
> < div
class = "item" > < / div
> < div
class = "item" > < / div
> < / div
> < / div
> < script type
= "text/javascript" > let items
= document
. getElementsByClassName ( 'item' ) for ( let i
= 0 ; i
< items
. length
; i
++ ) { items
[ i
] . onclick = function ( ) { items
[ i
] . style
. backgroundColor
= 'pink' } } console
. log ( window
. i
) < / script
> < / body
>
< / html
>
2.2. const關鍵字
const 關鍵字用來聲明常量, const聲明有以下特點
聲明必須賦初始值
標識符一般為大寫
不允許重復聲明
值不允許修改
塊級作用域
注意: 對象屬性修改和數(shù)組元素變化不會出發(fā) const錯誤
應用場景:聲明對象類型使用const,非對象類型聲明選擇 let
2.3. 變量的解構(gòu)賦值
ES6允許按照一定模式,從數(shù)組和對象中提取值,對變量進行賦值,這被稱為解構(gòu) 賦值。
const arr
= [ '張學友' , '劉德華' , '黎明' , '郭富城' ] ; let [ zhang
, liu
, li
, guo
] = arr
; const lin
= { name
: '林志穎' , tags
: [ '車手' , '歌手' , '小旋風' , '演員' ] } ; let { name
, tags
} = lin
; let wangfei
= { name
: '王菲' , age
: 18 , songs
: [ '紅豆' , '流年' , '曖昧' , '傳奇' ] , history
: [ { name
: '竇唯' } , { name
: '李亞鵬' } , { name
: '謝霆鋒' } ] } ; let { songs
: [ one
, two
, three
] , history
: [ first
, second
, third
] } = wangfei
;
注意:頻繁使用對象方法、數(shù)組元素,就可以使用解構(gòu)賦值形式
2.4. 模板字符串
模板字符串(template string)是增強版的字符串 用 反引號(`)標識 ,特點
字符串中可以出現(xiàn)換行符
let str
= ` <ul>
<li>沈騰</li>
<li>瑪麗</li>
<li>魏翔</li>
<li>艾倫</li>
</ul> ` ;
let star
= '王寧' ;
let result
= ` ${ star} 在前幾年離開了開心麻花 ` ;
注意:當遇到字符串與變量拼接的情況使用模板字符串 2) 可以使用 ${xxx} 形式輸出變量
2.5. 簡化對象寫法
ES6 允許在大括號里面,直接寫入變量和函數(shù),作為對象的屬性和方法。這樣的書寫更加簡潔。
let name
= 'zep' ; let slogon
= '永遠追求行業(yè)更高標準' ; let improve = function ( ) { console
. log ( '可以提高你的技能' ) ; } let atguigu
= { name
, slogon
, improve
, change ( ) { console
. log ( '可以改變你' ) } } ;
注意:對象簡寫形式簡化了代碼,所以以后用簡寫就對了
2.6. 箭頭函數(shù)
ES6 允許使用 「 箭頭 」 (=>)定義函數(shù) 。
let fn = ( arg1, arg2, arg3 ) => { return arg1
+ arg2
+ arg3
; }
箭頭函數(shù)的注意點 :
如果形參只有一個,則小括號可以省略
函數(shù)體如果只有一條語句,則花括號可以省略,函數(shù)的返回值為該條語句的執(zhí)行結(jié)果
箭頭函數(shù) this指向聲明時所在作用域下 this 的值
箭頭函數(shù)不能作為構(gòu)造函數(shù)實例化
不能使用 arguments
let fn2 = num => { return num
* 10 ; } ; let fn3 = score => score
* 20 ; let fn4 = ( ) => { console
. log ( this ) ; } let school
= { name
: '尚硅谷' , getName ( ) { let fn5 = ( ) => { console
. log ( this ) ; } fn5 ( ) ; } } ;
注意:箭頭函數(shù)不會更改this指向,用來指定回調(diào)函數(shù)會非常合適
案例1 :點擊div 2s 后顏色變成 粉色 案例2 :從數(shù)組中返回偶數(shù)的元素
注意:
箭頭函數(shù)適合與this無關的回調(diào)。定時器,數(shù)組的方法回調(diào) 箭頭函數(shù)不適合與this有關的回調(diào)。事件回調(diào),對象的方法
2.6 函數(shù)參數(shù)默認值
形參初始值, 具有默認值的參數(shù),一般位置要靠后放(潛規(guī)則) 與解構(gòu)賦值結(jié)合
2.7. rest參數(shù)
ES6引入 rest參數(shù),用于獲取 函數(shù)的實參,用來代替 arguments
function add ( ... args) { console
. log ( args
) ; } add ( 1 , 2 , 3 , 4 , 5 ) ; function minus ( a, b, ... args ) { console
. log ( a
, b
, args
) ; } minus ( 100 , 1 , 2 , 3 , 4 , 5 , 19 ) ;
注意: rest參數(shù)非常適合不定個數(shù)參數(shù)函數(shù)的場景
2.8. spread擴展運算符
擴展運算符(spread)也是三個點 (…)。它好比 rest 參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列,對數(shù)組進行解包。
let tfboys
= [ '德瑪西亞之力' , '德瑪西亞之翼' , '德瑪西亞皇子' ] ; function fn ( ) { console
. log ( arguments
) ; } fn ( ... tfboys
) let skillOne
= { q
: '致命打擊' , } ; let skillTwo
= { w
: '勇氣' } ; let skillThree
= { e
: '審判' } ; let skillFour
= { r
: '德瑪西亞正義' } ; let gailun
= { ... skillOne
, ... skillTwo
, ... skillThree
, ... skillFour
} ;
數(shù)組的合并 數(shù)組的克隆 將偽數(shù)組轉(zhuǎn)為真正的數(shù)組
2.9. Symbol
2.9.1. Symbol基本使用 ES6 引入了一種新的原始數(shù)據(jù)類型 Symbol,表示獨一無二的值。它是JavaScript 語言的第七種數(shù)據(jù)類型,是一種類似于字符串的數(shù)據(jù)類型。
Symbol特點:
Symbol的值是唯一的,用來解決命名沖突的問題
Symbol值不能與其他數(shù)據(jù)進行運算
Symbol定義的對象屬性不能使用 for…in循環(huán)遍歷,但是可以使用Reflect.ownKeys來獲取對象的所有鍵名
let s1
= Symbol ( ) ; console
. log ( s1
, typeof s1
) ; let s2
= Symbol ( '尚硅谷' ) ; let s2_2
= Symbol ( '尚硅谷' ) ; console
. log ( s2
=== s2_2
) ; let s3
= Symbol
. for ( '尚硅谷' ) ; let s3_2
= Symbol
. for ( '尚硅谷' ) ; console
. log ( s3
=== s3_2
) ;
注意:
遇到唯一性的場景時要想到 Symbol
總結(jié):js數(shù)據(jù)類型如下(7種)
< ! DOCTYPE html
>
< html
> < head
> < meta charset
= "utf-8" > < title
> < / title
> < / head
> < body
> < script type
= "text/javascript" > let game
= { up : function ( ) { console
. log ( 'game對象本來存在的up方法' ) } } let methods
= { up
: Symbol ( ) , down
: Symbol ( ) } game
[ methods
. up
] = function ( ) { console
. log ( '我可以改變形狀' ) } game
[ methods
. down
] = function ( ) { console
. log ( '我可以快速下降' ) } console
. log ( game
) console
. log ( '---------' ) let youxi
= { name
: '狼人殺' , [ Symbol ( 'say' ) ] : function ( ) { console
. log ( '我可以發(fā)言' ) } , [ Symbol ( 'zibao' ) ] : function ( ) { console
. log ( '我可以自爆' ) } } console
. log ( youxi
) < / script
> < / body
>
< / html
>
2.9.2. Symbol內(nèi)置值
除了定義自己使用的Symbol 值以外, ES6 還提供了 11個內(nèi)置的 Symbol值,指向語言內(nèi)部使用的方法。 可以稱這些方法為魔術方法,因為它們會在特定的場景下自動執(zhí)行。
2.10. 迭代器
遍歷器(Iterator)就是一種機制。它是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提 供統(tǒng)一的訪問機制。任何數(shù)據(jù)結(jié)構(gòu)只要部署 Iterator 接口,就可以完成遍歷操作 。
ES6創(chuàng)造了一種新的遍歷命令 for…of循環(huán), Iterator接口主要供 for…of消費 原生具備 iterator接口的數(shù)據(jù) (可用 for of遍歷 ) a) Array b) Arguments c) Set d) Map e) String f) TypedArray g) NodeList 工作原理 a) 創(chuàng)建一個指針對象,指向當前數(shù)據(jù)結(jié)構(gòu)的起始位置 b) 第一次調(diào)用對象的 next方法,指針自動指向數(shù)據(jù)結(jié)構(gòu)的第一個成員 c) 接下來不斷調(diào)用 next方法,指針一直往后移動,直到指向最后一個成員 d) 每調(diào)用 next方法返回一個包含 value和 done屬性的對象 注: 需要自定義遍歷數(shù)據(jù)的時候,要想到迭代器。
2.11. 生成器
生成器函數(shù)是 ES6提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同
function * gen ( ) { yield '一只沒有耳朵' ; yield '一只沒有尾巴' ; return '真奇怪' ;
}
let iterator
= gen ( ) ;
console
. log ( iterator
. next ( ) ) ;
console
. log ( iterator
. next ( ) ) ;
console
. log ( iterator
. next ( ) ) ;
代碼說明:
* 的位置沒有限制 生成器函數(shù)返回的結(jié)果是迭代器對象 ,調(diào)用迭代器對象的 next方法可以得到y(tǒng)ield語句后的值yield相當于函數(shù)的暫停標記,也可以認為是函數(shù)的分隔符,每調(diào)用一次 next方法,執(zhí)行一段代碼 next方法可以傳遞實參,作為 yield語句的返回值 案例1 :// 1s 后控制臺輸出 111 // 2s 后控制臺輸出 222 // 3s 后控制臺輸出 333
< ! DOCTYPE html
>
< html
> < head
> < meta charset
= "utf-8" > < title
> < / title
> < / head
> < body
> < script type
= "text/javascript" > 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 ( ) } let iterator
= gen ( ) iterator
. next ( ) < / script
> < / body
>
< / html
>
案例2 :模擬按如下順序獲取: 用戶數(shù)據(jù) 訂單數(shù)據(jù) 商品數(shù)據(jù)
< ! DOCTYPE html
>
< html
> < head
> < meta charset
= "utf-8" > < title
> < / title
> < / head
> < body
> < script type
= "text/javascript" > function getUsers ( ) { setTimeout ( ( ) => { let data
= '用戶數(shù)據(jù)' iterator
. next ( data
) } , 1000 ) } function getOrders ( ) { setTimeout ( ( ) => { let data
= '訂單數(shù)據(jù)' iterator
. next ( data
) } , 1000 ) } function getGoods ( ) { setTimeout ( ( ) => { let data
= '商品數(shù)據(jù)' iterator
. next ( data
) } , 1000 ) } function * gen ( ) { let users
= yield getUsers ( ) console
. log ( users
) let orders
= yield getOrders ( ) console
. log ( orders
) let goods
= yield getGoods ( ) console
. log ( goods
) } let iterator
= gen ( ) iterator
. next ( ) < / script
> < / body
>
< / html
>
2.12. Promise
Promise是 ES6引入的異步編程的 新解決方案 。語法上 Promise是一個構(gòu)造函數(shù),用來封裝異步操作并可以獲取其成功或失敗的結(jié)果。
Promise構(gòu)造函數(shù) : Promise (excutor) {} Promise.prototype.then方法 promise.then()的返回值:
沒有返回值 返回值為非Promise對象: 返回值為一個Promise對象: 返回值為拋出錯誤: 案例:讀取多個文件
Promise.prototype.catch方法
const fs
= require ( 'fs' )
const p
= new Promise ( function ( resolve, reject ) { fs
. readFile ( './resources/為學.mds' , ( err, data ) => { if ( err
) { return reject ( err
) } resolve ( data
) } )
} ) p
. then ( function ( value ) { console
. log ( value
. toString ( ) )
} , function ( error ) { console
. log ( '讀取失敗~~~' , error
)
} )
2.13. Set
ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set(集合 。它類似于數(shù)組,但成員的值都是唯一的 ,集合實現(xiàn)了 iterator接口,所以可以使用『擴展運算符』和『 for…of…』進行遍歷,集合的屬性和方法:
size 返回集合的元素個數(shù) add 增加一個新元素,返回當前集合 delete 刪除元素,返回 boolean 值 has 檢測集合中是否包含某個元素,返回 boolean值 clear 清空集合,返回 undefined
let s
= new Set ( ) ;
let s1
= new Set ( [ 1 , 2 , 3 , 1 , 2 , 3 ] ) ;
console
. log ( s1
. size
) ;
console
. log ( s1
. add ( 4 ) ) ;
console
. log ( s1
. delete ( 1 ) ) ;
console
. log ( s1
. has ( 2 ) ) ;
console
. log ( s1
. clear ( ) ) ;
2.14. Map
ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象,也是鍵值對的集合。 但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。 Map也實現(xiàn)了iterator接口,所以可以使用『擴展運算符』和『 for…of…』進行遍歷。
Map的屬性和方法:
size 返回 Map的元素個數(shù) set 增加一個新元素,返回當前 Map get 返回鍵名對象的鍵值 has 檢測 Map中是否包含某個元素,返回 boolean值 clear 清空集合,返回 undefined
let m
= new Map ( ) ;
let m2
= new Map ( [ [ 'name' , '尚硅谷' ] , [ 'slogon' , '不斷提高行業(yè)標準' ]
] ) ;
console
. log ( m2
. size
) ;
console
. log ( m2
. set ( 'age' , 6 ) ) ;
console
. log ( m2
. get ( 'age' ) ) ;
console
. log ( m2
. has ( 'age' ) ) ;
console
. log ( m2
. clear ( ) ) ;
2.15. class 類
ES6 提供了更接近傳統(tǒng)語言的寫法,引入了 Class(類)這個概念,作為對象的模板。通過 class關鍵字,可以定義類。基本上, ES6 的 class可以看作只是一個語法糖,它的絕大部分功能, ES5 都可以做到,新的 class寫法只是讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已。
使用ES5語法來實現(xiàn)類 使用ES6寫法 靜態(tài)成員和實例成員:
function Phone ( price ) { this . price
= price
} Phone
. name
= '手機' Phone
. change = function ( ) { console
. log ( '我可以改變世界' ) } Phone . prototype
. size
= '5.5英寸' let nokia
= new Phone ( 9999 ) console
. log ( nokia
. name
) console
. log ( Phone
. name
) console
. log ( nokia
. price
) console
. log ( Phone
. price
) console
. log ( nokia
. size
) console
. log ( Phone
. size
)
ES5 中實現(xiàn)類的繼承:
ES6 中實現(xiàn)類的繼承:
class Phone { constructor ( brand, price ) { this . brand
= brand
this . price
= price
} callyou ( ) { console
. log ( '我可以打電話!!!' ) } } class SmartPhone extends Phone { constructor ( brand, price, color, size ) { super ( brand
, price
) this . color
= color
this . size
= size
} photo ( ) { console
. log ( '拍照' ) } playGame ( ) { console
. log ( '打游戲' ) } } const xiaomi
= new SmartPhone ( '小米' , 999 , '黑色' , '4.7英寸' ) console
. log ( xiaomi
) xiaomi
. callyou ( ) xiaomi
. photo ( ) xiaomi
. playGame ( )
知識點:
class聲明類 constructor定義構(gòu)造函數(shù)初始化 extends繼承父類 super調(diào)用父級構(gòu)造方法 static定義靜態(tài)方法和屬性 父類方法可以重寫
class Phone { constructor ( brand, color, price ) { this . brand
= brand
; this . color
= color
; this . price
= price
; } call ( ) { console
. log ( '我可以打電話!!!' ) } } class SmartPhone extends Phone { constructor ( brand, color, price, screen, pixel ) { super ( brand
, color
, price
) ; this . screen
= screen
; this . pixel
= pixel
; } photo ( ) { console
. log ( '我可以拍照!!' ) ; } playGame ( ) { console
. log ( '我可以玩游戲!!' ) ; } call ( ) { console
. log ( '我可以進行視頻通話!!' ) ; } static run ( ) { console
. log ( '我可以運行程序' ) } static connect ( ) { console
. log ( '我可以建立連接' ) } } const Nokia
= new Phone ( '諾基亞' , '灰色' , 230 ) ; const iPhone6s
= new SmartPhone ( '蘋果' , '白色' , 6088 , '4.7inch' , '500w' ) ; iPhone6s
. playGame ( ) ; iPhone6s . call ( ) ; SmartPhone
. run ( ) ;
2.16. 數(shù)值擴展
Number.EPSILON是Javascript表示的最小精度 EPSILON 屬性的值接近于2.2204468492503138808472633361816E-16 因為浮點數(shù)計算是不精確的, 引入一個這么小的量的目的,在于為浮點數(shù)計算,設置一個誤差范圍。 Number.EPSILON可以用來設置“能夠接受的誤差范圍”。比如,誤差范圍設為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數(shù)的差小于這個值,我們就認為這兩個浮點數(shù)相等 。
2.16.1. 二進制和八進制
ES6 提供了二進制和八進制數(shù)值的新的寫法,分別用前綴 0b和 0o表示。
2.16.2. Number.isFinite() 與 Number.isNaN()
Number.isFinite() 用來檢查一個數(shù)值是否為有限的
Number.isNaN() 用來檢查一個值是否為 NaN
2.16.3. Number.parseInt() 與 Number.parseFloat()
ES6 將全局方法 parseInt和 parseFloat,移植到 Number對象上面,使用不變。
2.16.4. Math.trunc
用于去除一個數(shù)的小數(shù)部分,返回整數(shù)部分。
2.16.5. Number.isInteger
Number.isInteger() 用來判斷一個數(shù)值是否為整數(shù)
2.16.6. Math.sign
Math.sign 判斷一個數(shù)字是正數(shù)負數(shù)還是0
2.17. 對象擴展
ES6新增了一些 Object對象的方法
Object.is 比較兩個值是否嚴格相等,與『 ===』行為基本一致(+0 與 NaN)
Object.assign 對象的合并,將源對象的所有可枚舉屬性,復制到目標對象
__proto__、 setPrototypeOf、 setPrototypeOf可以直接設置對象的原型
2.18. 模塊化
模塊化是指將一個大的程序文件,拆分成 許多小的文件,然后將小文件組合起來。
2.18.1. 模塊化的好處
模塊化的優(yōu)勢有以下幾點:
防止命名沖突 代碼復用 高維護性
2.18.2. 模塊化規(guī)范 產(chǎn)品
ES6之前的模塊化規(guī)范有
CommonJS => NodeJS、 Browserify AMD => requireJS CMD => seaJS
2.18.3. ES6模塊化語法
模塊功能主要由兩個命令構(gòu)成: export和 import。
export命令用于規(guī)定模塊的對外接口 import命令用于輸入其他模塊提供的功能
分別暴露 export xxx 統(tǒng)一暴露 export {school, findJob} 默認暴露 export default:
2.18.4 ES6引入模塊語法匯總
2.18.5. 瀏覽器使用模塊化的方式:
2.18.6. babel
安裝工具 babel-cli babel-preset-env browserify(webpack) npx babel ./js -d dist/js --presets=babel-preset-env 打包 npx browserify dist/js/app.js -o dist/bundle.js
使用babel-cli babel-preset-env 將ES6語法轉(zhuǎn)成ES5語法,來解決低版本瀏覽器不識別ES6語法的問題 使用browserify(webpack)將轉(zhuǎn)換好的ES5語法文件進行打包,生成瀏覽器可以運行的代碼
2.18.7. ES6模塊化引入npm 包
總結(jié)
以上是生活随笔 為你收集整理的JavaScript高级之ECMAScript 6 新特性 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。