ECMAScript5是2009年標準化的規範,IE9+和現代瀏覽器均支持,已經能夠大規模應用的新特性html
限制一些用法,至關於棄用了一些以前的語法:http://www.cnblogs.com/snandy/p/3428171.html數組
let arr = [1,2,3] { //forEach arr.forEach(function(val,i,arr){ //console.log(val,i,arr) }) } { //map:返回一個數組,包含該函數的返回值 let map_arr = arr.map(function(val,i,arr){ return val*2 }) //console.log(map_arr) //[2,4,6] } { //filter:返回數組的一個子集。傳遞的函數是用來邏輯判斷的:true/false。 //若是返回值爲true或能轉化爲true的值,那麼傳遞給判斷函數的元素就是這個子集的成員 let filter_arr = arr.filter(function(val,i,arr){ return val > 1 }) //console.log(filter_arr) //[2,3] } { //every/some: 它們對數組元素應用指定的函數進行判斷,返回true或false //every: 當且僅當都返回true,它才返回true。 //some: 當且僅當針都返回false,它才返回false let every_arr = arr.every(function(val,i,arr){ return val > 1 }) let some_arr = arr.some(function(val,i,arr){ return val > 1 }) //console.log(every_arr,some_arr) //false true } { //indexOf/lastIndexOf: 搜索整個數組中具備給定值的元素,返回找到的第一個元素的索引或者若果沒有找到則返回-1 //注意:並不會作類型轉換 let indexOf_arr = arr.indexOf(2) //console.log(indexOf_arr) //1 } { //reduce/reduceRight: 接收一個函數做爲累加器,數組中的每一個值(從左到右)開始縮減,最終爲一個值 let reduce_arr = arr.reduceRight(function(previous, current, index, array){ console.log('previous:'+previous) console.log('current:'+current) console.log('index:'+index) console.log('----------------') return previous + current; }); //console.log(reduce_arr) //1 } { //isArray:判斷是不是數組 Array.isArray(arr) }
//Object 擴展:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty var obj = {}; { //Object.defineProperty(obj, prop, descriptor):在一個對象上定義一個新屬性,或者修改一個已經存在的屬性, 並返回這個對象 //descriptor:描述符:屬性描述符有兩種主要形式:數據描述符和存取描述符 //1.數據描述符 Object.defineProperty(obj,"a",{ //這個屬性起到兩個做用: //目標屬性是否能夠使用delete刪除 //目標屬性是否能夠再次設置特性 configurable:false, //此屬性是否能夠被枚舉(使用for...in或Object.keys()) enumerable:false, value:undefined, //值是否能夠重寫 writable:false }); //2.存取描述符 Object.defineProperty(obj,"b",{ configurable:false, enumerable:false, //注意: //當使用了getter或setter方法,不容許使用writable和value這兩個屬性 //get或set不是必須成對出現,任寫其一就能夠。若是不設置方法,則get和set的默認值爲undefined get:function (){return 1} }); //demo let _obj = {} var initValue = 'hello' Object.defineProperty(_obj,"newKey",{ get:function (){ //當獲取值的時候觸發的函數 return initValue }, set:function (value){ //當設置值的時候觸發的函數,設置的新值經過參數value拿到 initValue = value } }); //獲取值 //console.log( _obj.newKey ) //hello //設置值 _obj.newKey = 'change value' //console.log( _obj.newKey ) //change value } { //Object.defineProperties() 方法在一個對象上添加或修改一個或者多個自有屬性,並返回該對象 let _obj = {} Object.defineProperties(_obj, { "property1": { value: true, writable: true }, "property2": { value: "Hello", writable: false } // 等等. }); //console.log(_obj.property2) //"Hello" } { //Object.create:建立一個擁有指定原型和若干個指定屬性的對象 let proto = {aa:11} let o = Object.create(proto, { // foo會成爲所建立對象的數據屬性 foo: { writable:true, configurable:true, value: "hello" }, // bar會成爲所建立對象的訪問器屬性 bar: { configurable: false, get: function() { return 10 }, set: function(value) { console.log("Setting `o.bar` to", value) } }}) } { //獲取給丁對象的prototype對象。等價於之前的o.__proto__ Object.getPrototypeOf(obj) //返回對象的全部可枚舉(enumerable)屬性的名稱:不含繼承 Object.keys(obj) //獲取自有屬性名列表:不含繼承 Object.getOwnPropertyNames(obj) } { //阻止對象添加屬性,但能夠修改和刪除 Object.preventExtensions(object) //不能添加和刪除屬性 Object.seal(object) //阻止屬性和屬性值得修改,防止新屬性的添加 Object.freeze(object) //對應: Object.isExtensible() Object.isSealed() Object.isFrozen() }
{ Date.now() // 1483334011674 }
//JSON對象 { //JSON.parse() 解析一個JSON字符串,構造由字符串描述的JavaScript值或對象 //JSON.stringify() 將JavaScript值轉換爲JSON字符串 }
{ //String.prototpye.trim:去掉字符串兩頭的空白符和換行符。 ' ddd '.trim() } { //字符訂閱 "abc"[2] === "b" }
{ //爲了指定當前函數的上下文對象和運行參數,該函數建立一個新的函數,保留給定的this對象和運行參數。 //Function.prototype.bind(thisTarget, arg1,...argn) (function(){console.log(this,arguments)}).bind({},1,2)() //下面實現一個pollfill if(!Function.prototype._bind){ Function.prototype._bind = function(){ var _this = this var context = [].shift.call(arguments) var arg = [].slice.call(arguments) return function(){ _this.apply(context,arg.concat([].slice.call(arguments))) } } } }