====== Event loop ====== JavaScript 运行机制详解-再谈Event Loop: http://www.ruanyifeng.com/blog/2014/10/event-loop.html ====== 根据浏览器地址解析参数 ====== var getURLParam = function(name){ var search = document.location.search; var pattern = new RegExp("[?&]"+name+"\=([^&]+)", "g"); var matcher = pattern.exec(search); var items = null; if(null != matcher){ try{ items = decodeURIComponent(decodeURIComponent(matcher[1])); }catch(e){ try{ items = decodeURIComponent(matcher[1]); }catch(e){ items = matcher[1]; } } } return items; }; ====== 正则表达式 ====== 过目不忘JS正则表达式: https://www.cnblogs.com/moqing/archive/2016/07/13/5665126.html 正则表达式函数区别:exec, match, test, search str.search(regx) 返回的是第一个匹配的位置位置,比如 "https://www.baidu.com?id=24324&id=2888&id=2299".search(/[?&]id=([^&]+)/g); 返回21 "https://www.baidu.com?id=24324&id=2888&id=2299".match(/[?&]id=([^&]+)/g); 返回一个数组:["?id=24324", "&id=2888", "&id=2299"] /[?&]id=([^&]+)/g.test("https://www.baidu.com?id=24324&id=2888&id=2299") 返回true /[?&]id=([^&]+)/g.exec("https://www.baidu.com?id=24324&id=2888&id=2299"); 返回的是类数组: { 0: "?id=24324", 1:"24324", index: 21, length:2, input: "https://www.baidu.com?id=24324&id=2888&id=2299" } \s:空格, \S:非空格, \d:数字, \D:非数字 \w:字符(字母数字下划线), \W:非字符 JS正则表达式详解: https://www.cnblogs.com/moqiutao/p/6513628.html ====== 判断浏览器类型 ====== function isWechat() { var ua = window.navigator.userAgent.toLowerCase(); return (ua.match(/MicroMessenger/i) == 'micromessenger'); ====== Jquery ajax, Axios, Fetch区别之我见 ====== https://segmentfault.com/a/1190000012836882 //jQuery ajax $.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () {}, error: function () {} }); //Axios axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); vue axios全攻略: https://www.cnblogs.com/libin-1/p/6607945.html ====== JS数组极其方法 ====== 创建数组的方式: 采用自变量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 使用Array数组的方式 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度 var arrayObj = new Array([element0, [, element1[,...[, elementN]]]]); //创建一个数组并赋值 要说明的是,虽然第二种方法创建数组指定了长度,但实际上所有情况下数组都是变长的, 也就是说即使指定了长度为5,仍然可以将元素存储在规定长度以外的,注意:这时长度会随之改变。 JS数组的主要方法: arrayObj. push([item1 [item2 [. . . [itemN ]]]]); // 将一个或多个新元素添加到数组结尾,并返回数组新长度 arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]); // 将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度 arrayObj.splice(insertPos,0,[item1[, item2[, . . . [,itemN]]]]); //将一个或多个新元素插入到数组的指定位置,插入位置的元素自动后移,返回""。

Click the button to add a new element to the array.

数组元素的删除 arrayObj.pop(); //移除最后一个元素并返回该元素值(pop和push连在一起记忆,队列形式的操作) arrayObj.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移(shift,unshift针对的都是数组最前面的元素,栈形式的数据操作) arrayObj.splice(deletePos,deleteCount); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素 注意:splice方法既可以用于数组的删除也可以用于数组的插入 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。 arrayObject.splice(index,howmany,item1,.....,itemX) index:必填,数组删除或插入的位置。使用负数可从数组结尾处规定位置。 howmany:必需。要删除的项目数量。如果设置为 0,则不会删除项目。 item1, ..., itemX:可选。向数组添加的新项目。 返回值:新数组,要是删除的话,也会包括被删除的元素 要是删除的话,splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个 或多个值来替换那些被删除的元素。如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组 请注意,splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。 splice例子:我们将删除从 index 2 ("Thomas") 开始的三个元素,并添加一个新元素 ("William") 来替代被删除的元素: ====== 数组元素的截取 ====== 1,slice方法: arrayObject.slice(start,end)可以从数组中返回start下标开始取值,直到end下标结束(不包括)。 start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。 也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。 end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数, 那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。若end为 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。 注意:请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。 https://www.cnblogs.com/happyfish321/p/6724004.html
====== 排序算法 ====== function quickSort(arr){ //如果数组<=1,则直接返回 if(arr.length<=1){return arr;} var pivotIndex=Math.floor(arr.length/2); //找基准,并把基准从原数组删除 var pivot=arr.splice(pivotIndex,1)[0]; //定义左右数组 var left=[]; var right=[]; //比基准小的放在left,比基准大的放在right for(var i=0;iarr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } sortarr(examplearr); console.log(examplearr); ====== 求1000以内的质数 ====== var count = 0; for(var i = 2; i<1000; i++) { for(var j = 1; j<= Math.sqrt(i); j++) { if(i%j == 0) { count ++ ; } } if(count == 1) { document.write(i + " "); } count = 0; } ====== js实现单例模式 ====== //单例模式抽象,分离创建对象的函数和判断对象是否已经创建 var getSingle = function (fn) { var result; return function () { return result || ( result = fn.apply(this, arguments) ); } }; //用法 var createLoginLayer = function(){ var frag = document.createDocumentFragment(); var div = document.createElement('div'); div.style.display = 'none'; //以下给div添加其它登录元素 ... document.body.appendChild(frag.appendChild(div)); return div; } var createSingleLoginLayer = getSingle(createLoginLayer); //当用户第一次点击按钮(id = 'lgBtn')时,来创建并显示登录窗口,之后重复点击按钮不会重复创建; document.getElementById('lgBtn').onclick = function(){ var lg = createSingleLoginLayer(); lg.style.display = 'block'; } ====== 考核闭包 ====== function test() { var num = 100; function a () { num++; console.log(num); } function b () { num --; console.log(num); } return [a,b] } var myArr = test(); myArr[0](); myArr[1](); 结果: 101 100 ====== 考核闭包2 ====== function test() { var arr = []; for(var i=0; i<10; i++) { arr[i] = function() { document.write(i + " "); } } return arr; } var myArr = test(); for(var j=0; j<10; j++) { myArr[j](); } 如果用立即执行函数改造就可以输出 0,1,2。。。。9 function test() { var arr = []; for(var i=0; i<10; i++) { (function(j) { arr[j] = function() { document.write(j + " "); } }(i)); } return arr; } var myArr = test(); for(var j=0; j<10; j++) { myArr[j](); }