//宣告3個物件,每個物件都有屬性id和date var a = {id : 1, date : new Date(2019,3,12)}, b = {id : 2, date : new Date(2019,1,14)}, c = {id : 3, date : new Date(2019,2,26)}; var arr = [a,b,c]; arr.sort(function(x,y){ return x.date-y.date; }); for (var i = 0; i < arr.length; i++) { console.log(arr[i].id + " " + arr[i].date.toLocaleString()); }輸出結果:
2 2019 年 2 月 14 日 0:00:00
3 2019 年 3 月 26 日 0:00:00
1 2019 年 4 月 12 日 0:00:00
map(array,func)
map 表示式將 func 函數作用於 array 的每一個元素,並返回一個新的 array。function map(array,func) { var res = []; for (var i in array) { res.push(func(array[i])); } return res; } console.log(map([1,3,5,7,8], function (n) { //返回元素值的平方 return n * n; })); //1,9,25,49,64 console.log(map(["one", "two", "three", "four"], function(item) { //返回首字母大寫 return item[0].toUpperCase() + item.slice(1).toLowerCase(); })); //One,Two,Three,Four兩次呼叫 map,卻得到了截然不同的結果,是因為 map 的引數本身已經進行了一次抽象,map 函數做的是第二次抽象。注意:高階的“階”可以理解為抽象的層次。
var getSingle = function (fn) { var ret; return function () { return ret || (ret = fn.apply(this, arguments)); }; };
function XHR () { //定義XMLHttpRequest 物件 return new XMLHttpRequest(); } var xhr = getSingle(XHR); //封裝XHR範例 var a = xhr(); //範例1 var b = xhr(); //範例2 console.log(a === b); //true,說明這兩個範例實際上相同
<button>僅能點選一次</button> <script> function getSingle (fn) { var ret; return function () { return ret || (ret = fn.apply(this,arguments)); }; }; var f = function () { console.log(this.nodeName); } //事件處理常式 document.getElementsByTagName("button")[0].onclick = getSingle(f); </script>
Function.prototype.before = function (beforefn) { var __self = this; //儲存原函數的參照 return function () { //返回包含了原函數和新函數的“代理”函數 beforefn.apply(this, arguments); //執行新函數 return __self.apply(this, arguments); //執行原函數 } }; Function.prototype.after = function (afterfn) { var __self = this; //儲存原函數的參照 return function () { //返回包含了原函數和新函數的“代理”函數 var ret = __self.apply(this,arguments); //執行原函數 afterfn.apply(this, arguments); //執行新函數,修正this return ret; } }; var func = function (){ console.log(2); }; func = func.before(function () { console.log(1); }).after(function () { console.log(3) }); func(); //按順序輸出1,2,3
function typeOf(obj) { //型別檢測函數,返回字串表示 var str = Object.prototype.toString.call(obj); return str.match(/[object(.*?)]/)[1].toLowerCase(); }; ['null', 'Undefined', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'RegExp'].forEach(function (t) { //型別判斷,返回布林值 typeOf['is' + t] = function (o) { return typeOf(o) === t.toLowerCase(); }; });
//型別檢測 console.log(typeOf({})); //"object" console.log(typeOf([])); //"array" console.log(typeOf(0)); //"number" console.log(typeOf(null)); //"null" console.log(typeOf(undefined)); //"undefined" console.log(typeOf(//)); //"regex" console.log(typeOf(new Date())); //"date" //型別判斷 console.log(typeOf.isObject({})); //true console.log(typeOf.isNumber(NaN)); //true console.log(typeOf.isRegExp(true)); //false