之前兩篇博客 ECMAScript5 Object的新屬性方法,ECMAScript5 Array新增方法,分別介紹了ECMAScript5對Object和Array的拓展,這兩個對象最常用,而且改動比較多,剩下的對象拓展比較少
String.prototype.trim()
這是字符串的一個實例方法,用於去除字符串首尾的空白符(不只是空格,還有tab、垂直制表符啊神馬的)和換行符,終於不用自己用正則表達式寫了,這個方法返回trim后結果,不改變原字符串值
var s = ' 123 \n'; console.log(s.length);//6 console.log(s.trim());//123 console.log(s.trim().length);//3 console.log(s); // 123 console.log(s.length); //6
Function.prototype.bind(thisArg,[,arg1[,arg2,…]])
Function.prototype.bind返回一個把內部this設為thisArg的方法,讀起來很繞,其實就是,返回一個新方法,這個方法內部的this是參數thisArg
<div id="test">Click Here</div>
var handler = { message: 'This is a test', click: function () { alert(this.message); } };
document.getElementById('test').onclick = handler.click;
如果這樣綁定div的click事件處理程序,大家都會看出來,點擊的時候彈出來的對話框內容是undefined,因為執行的時候this是window,我們需要一定的技巧才可以處理此事,達到預期效果,但是使用新添的bind我們可以輕松改變this
document.getElementById('test').onclick = handler.click.bind(handler);
這樣就可以達到我們預期效果了。
ECMAScript提供了一個全局的對象JSON,用來處理json的序列化和反序列化來實現類似於json2.js中的效果,內置的函數總比我們自己寫的要效率高一些
JSON.parse(text [,reviver])
JSON.parse用於反序列化json格式字符串為對象,第二個參數是可選的,是一個有key和value兩個參數的函數,用於過濾或者處理返回值
var jsonString = '{"name":"Byron", "age":24}'; var jsonObj = JSON.parse(jsonString); console.log(typeof jsonObj); //Object console.log(jsonObj.name); //Byron
對一些復雜的嵌套結構也能夠勝任
var jsonString = '[{"name":"Byron", "age":24,"Books":{"B1":"Love","B2":"Good"}},{"name":"Byron", "age":24,"Books":{"B1":"Love","B2":"Good"}}]'; var jsonObj = JSON.parse(jsonString);
var jsonString = '{"name":"Byron", "age":24}'; var jsonObj = JSON.parse(jsonString, function (key, value) { if (typeof value == 'string') { return value.toUpperCase(); } else { return value; } }); console.log(jsonObj.name); //BYRON
JSON.stringify(value [, replacer [, space]])
JSON.stringify方法用於序列化json對象為字符串,最簡單的就是傳入一個json對象
var jsonObj = { "name": "Byron", "BirthDate": new Date('06/15/1989') }; var jsonStr=JSON.stringify(jsonObj); console.log(jsonStr); // {"name":"Byron","BirthDate":"1989-06-14T16:00:00.000Z"}
可以看到在序列化Date對象的時候調用了其toJson方法,replacer是一個可選參數,有兩種情況,可以使方法或數組
方法:這個貌似很好理解,方法也有key和value兩個參數,在序列化過程中對數據進行處理,順便說說第三個參數space,這是一個分隔符,表示用什么區分開對象的每項內容,省略的話就沒有,向上面那樣是一句;數字表示所及幾個字符,大於10的按10處理;普通字符串就是把字符串附加,最大長度也是10;號可以使用\t等轉移字符
var jsonObj = { "name": "Byron", "BirthDate": new Date('06/15/1989') }; var jsonStr = JSON.stringify(jsonObj, function (key, value) { if (typeof value == 'string') { return value.toUpperCase(); } else { return value; } },'\t'); console.log(jsonStr); /*{ "name": "BYRON", "BirthDate": "1989-06-14T16:00:00.000Z" } */
數組:主要起一個過濾作用,只會序列化對象中屬性名存在於數組元素的鍵值對
var jsonObj = { "name": "Byron", "BirthDate": new Date('06/15/1989'), "age":24, "sex":"male" }; var arr = ['name', 'age']; var jsonStr = JSON.stringify(jsonObj,arr,3); console.log(jsonStr); /*{ "name": "BYRON", "age": 24 } */
BirthDate和sex屬性不在數組arr中,沒有被序列化
支持ISO類型的Date
在之前的JavaScript中可以使用以下幾種方式創建Date實例
new Date() //Date {Fri Aug 02 2013 16:50:33 GMT+0800 (China Standard Time)} new Date(milliseconds) //Date {Fri Aug 02 2013 16:53:26 GMT+0800 (China Standard Time)} new Date("2013/08/02") //Date {Fri Aug 02 2013 00:00:00 GMT+0800 (China Standard Time)} new Date("08/02/2013") //Date {Fri Aug 02 2013 00:00:00 GMT+0800 (China Standard Time)} new Date(year, month, day, hours, minutes, seconds, ms)
ECMAScript5為其添加了ISO-8601格式的支持,可以為構造函數傳一個ISO格式時間字符串
console.log(new Date("1970-01-01T00:00:00.000Z")); //Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)
同時添加了一個toISOString方法
console.log(new Date().toISOString()); // 2013-10-07T05:54:38.743Z
Date.prototype.toJSON()
從Date類型轉成json的方法,序列化的時候用
console.log((new Date).toJSON()); // 2013-10-07T06:06:29.288Z
Date.now()
獲取當前的時間戳
console.log(Date.now()); // 1381125894410