ECMAScript
第六版已經(jīng)于2015年發(fā)布,某些瀏覽器已經(jīng)開始支持ES6
了胆屿,這篇文章整理一下ES5
以及ES6
的新特性。
ECMAScript簡介
它是一種由Ecma國際(前身為歐洲計算機制造商協(xié)會)制定和發(fā)布的腳本語言規(guī)范,JavaScript
在它的基礎上進行了自己的封裝习霹。但其實通常來說呜投,術語ECMAScript
和JavaScript
指的是同一個東西加匈。
JS
包含三個部分:ECMAScript(核心)
,DOM(文檔對象模型)
仑荐,BOM(瀏覽器對象模型)
雕拼。ECMAScript
是JS
語言的基礎。
ECMAScript
的最新版是第六版ECMAScript 6
粘招,于2015年6月17日發(fā)布啥寇,截止發(fā)布日期,JavaScript
的官方名稱是ECMAScript 2015
洒扎,是當前最新的正式規(guī)范辑甜。
ECMAScript
的各個版本:(從第三版開始說)
(1) 第三版ECMAScript3
新增了對正則表達式、新控制語句逊笆、try-catch異常處理的支持栈戳,修改了字符處理、錯誤定義和數(shù)值輸出等內(nèi)容难裆。標志著ECMAScript成為了一門真正的編程語言子檀。
(2) 第四版于2008年7月發(fā)布前被廢棄。
(3) 第五版ECMAScript5
力求澄清第3版中的歧義乃戈,并添加了新的功能褂痰。新功能包括:原生JSON對象、繼承的方法症虑、高級屬性的定義以及引入嚴格模式缩歪。
(4) 第六版ECMAScript6
是繼ES5之后的一次主要改進,增添了許多必要的特性谍憔,例如:模塊和類以及一些實用特性匪蝙,Maps、Sets习贫、Promises逛球、生成器(Generators)等。
ECMAScript5的新特性
參考鏈接:http://www.tuicool.com/articles/vMv6b2z
并不是所有瀏覽器都完全支持ES5的新特性苫昌,比如低版本的IE颤绕,但是其他的主流瀏覽器都支持了,其中IE9不支持ES的嚴格模式,從IE10開始支持奥务。Safari 5.1不支持Function.prototype.bind
物独。這也就是說,在移動端可以比較放心地使用ES5氯葬。
(1)嚴格模式
Strict Mode
, 即所謂的嚴格模式挡篓。嚴格模式的意義是為了提供一種更佳良好錯誤檢查機制,讓你規(guī)避掉一些語言本身的bad point溢谤。
開啟嚴格模式的方法很簡單瞻凤,只需要在文件的頂部寫上字符串 use strict
即可。當然這需要執(zhí)行環(huán)境支持嚴格模式世杀。另外由于use strict
其實是一個字符串常量。那么即使遇到不支持嚴格模式的環(huán)境肝集,這行字符串只會被安全的忽略瞻坝,不會帶來任何的問題。
比如在嚴格模式下杏瞻,我們不可以使用一個未經(jīng)聲明的變量所刀。以前沒有用var
聲明的變量,會自動成為全局變量捞挥,而在嚴格模式下浮创,會報錯。
還有另一些會出現(xiàn)問題的地方砌函,附鏈接:
http://www.jb51.net/article/78974.htm
(2)JSON對象
JSON.parse(jsonstr);
//可以將json字符串轉(zhuǎn)換成json對象
JSON.stringify(jsonobj);
//可以將json對象轉(zhuǎn)換成json對符串
(3)新增 Object接口
對象 | 構造器 | 說明 |
---|---|---|
Object | getPrototypeOf | 返回對象的原型 |
Object | getOwnPropertyDescriptor | 返回對象自有屬性的屬性描述符 |
Object | getOwnPropertyNames | 返回一個數(shù)組斩披,包括對象所有自有屬性名稱集合(包括不可枚舉的屬性) |
Object | create | 創(chuàng)建一個擁有置頂原型和若干個指定屬性的對象 |
Object | defineProperty | 給對象定義一個新屬性,或者修改已有的屬性讹俊,并返回 |
Object | defineProperties | 在一個對象上添加或修改一個或者多個自有屬性垦沉,并返回該對象 |
Object | seal | 鎖定對象。阻止修改現(xiàn)有屬性的特性仍劈,并阻止添加新屬性厕倍。但是可以修改已有屬性的值。 |
Object | freeze | 凍結對象贩疙,阻止對對象的一切操作讹弯。凍結對象將永遠不可變。 |
Object | preventExtensions | 讓一個對象變的不可擴展这溅,也就是永遠不能再添加新的屬性组民。 |
Object | isSealed | 判斷對象是否被鎖定 |
Object | isFrozen | 判斷對象是否被凍結 |
Object | isExtensible | 判斷對象是否可以被擴展 |
Object | keys | 返回一個由給定對象的所有可枚舉自身屬性的屬性名組成的數(shù)組 |
比較常用的有:
- Object.create
- Object.defineProperties
- Object.keys
(4)新增Array接口
對象 | 構造器 | 說明 |
---|---|---|
Array.prototype | indexOf | 返回根據(jù)給定元素找到的第一個索引值,否則返回-1 |
Array.prototype | lastIndexOf | 方法返回指定元素在數(shù)組中的最后一個的索引芍躏,如果不存在則返回 -1 |
Array.prototype | every | 測試數(shù)組的所有元素是否都通過了指定函數(shù)的測試 |
Array.prototype | some | 測試數(shù)組中的某些元素是否通過了指定函數(shù)的測試 |
Array.prototype | forEach | 讓數(shù)組的每一項都執(zhí)行一次給定的函數(shù) |
Array.prototype | map | 返回一個由原數(shù)組中的每個元素調(diào)用一個指定方法后的返回值組成的新數(shù)組 |
Array.prototype | filter | 利用所有通過指定函數(shù)測試的元素創(chuàng)建一個新的數(shù)組邪乍,并返回 |
Array.prototype | reduce | 接收一個函數(shù)作為累加器,數(shù)組中的每個值(從左到右)開始縮減,最終為一個值 |
Array.prototype | reduceRight | 接受一個函數(shù)作為累加器庇楞,讓每個值(從右到左榜配,亦即從尾到頭)縮減為一個值 |
這些都是比較常用的,另外吕晌,還有一個 Array.isArray()
蛋褥,用來判斷某一對象是否為數(shù)組。(typeof
判斷的話睛驳,返回object
烙心,用instanceof
判斷的話,IE
上的返回值不正確)
(5)Function.prototype.bind
bind()方法會創(chuàng)建一個新函數(shù),稱為綁定函數(shù).當調(diào)用這個綁定函數(shù)時,綁定函數(shù)會以創(chuàng)建它時傳入bind()方法的第一個參數(shù)作為 this,傳入 bind() 方法的第二個以及以后的參數(shù)加上綁定函數(shù)運行時本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調(diào)用原函數(shù)乏沸。
這個方法可以改變this的指向淫茵,為函數(shù)自定義 this指針。
Javascript中重新綁定 this變量的語法糖還有 call和 apply 蹬跃。不過 bind顯然與它們有著明顯的不同匙瘪。 bind將會返回一個新的函數(shù),而 call或者 apply并不會返回一個新的函數(shù)蝶缀,它們將會使用新的 this指針直接進行函數(shù)調(diào)用丹喻。
ES5的瀏覽器支持情況
http://kangax.github.io/compat-table/es5/
http://www.xuebuyuan.com/2122607.html
從這上面看來,IE8只支持defineProperty
翁都、getOwnPropertyDescriptor
的部分特性和JSon的新特性碍论,IE9支持除了嚴格模式以外的新特性,IE10和其他主流瀏覽器都支持了柄慰。
因此在PC端開發(fā)的時候鳍悠,要注意IE9以下的兼容,移動端開發(fā)時先煎,可以比較放心了贼涩。
ES6的新特性
(1)箭頭操作符=>
(2)類的支持--class關鍵字
(3)增強的對象字面量
(4)字符串模板
(5)解構
(6)參數(shù)默認值,不定參數(shù)薯蝎,拓展參數(shù)
(7)let與const 關鍵字
(8)for of 值遍歷
(9)iterator, generator
(10)模塊
(11)Proxies
(12)Symbols
(13)Math遥倦,Number,String占锯,Object 的新API
(14)Promises
新特性太多袒哥,就不一一詳細地寫了,具體請看參考文章鏈接:
http://www.cnblogs.com/Wayou/p/es6_new_features.html
ES6的瀏覽器支持情況
鏈接:
http://www.xuebuyuan.com/2122607.html
http://kangax.github.io/compat-table/es6/
可以看出來消略,基本上是沒有瀏覽器完全支持的堡称,所以還是不要直接用的好。
但是有轉(zhuǎn)換器 (更準確地說是源代碼到源代碼的編譯器) 可以把ES6轉(zhuǎn)換為被瀏覽器接受的ES5艺演,比如Babel以及Traceur 之類的項目却紧。其中Babel對 ES6 的支持程度比其它同類更高桐臊,而且 Babel 擁有完善的文檔和一個很棒的在線交互式編程環(huán)境,因此用的比較多晓殊。