基础 好用方法 
二维数组横纵列转置的方法 
 
1 2 3 4 5 var  newArray = arr[0 ].map (function (col, i ) {  return  arr.map (function (row ) {     return  row[i];   }) }); 
插件、工具等 1. 使用 1 2 3 4 var  edit = $('#editForm' );for  (var  p in  data) {  edit.find (":input[name='"  + p + "']" ).val (data[p]); } 
1 document .getElementById ("editForm" ).reset ();
EJS 1. Node.js后台渲染 1 2 3 4 5 6 7 8 9 10 11 12 13 <div  class ="main-content" >      <% include ./layout/sidebar.html %>         <% include ./layout/header.html %>      <% var page ="./page/"+pagename+".html"%>//定义一个变量,用来动态引入   <%- include(page)%>      <% include ./layout/footer.html %>    </div > 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var  ejs = require ('ejs' );var  express = require ('express' );path = require ('path' ) var  app = express ();app.engine ('html' , ejs.__express ); app.set ('views' , path.join (__dirname, 'views' )); app.set ('view engine' , 'html' ); exports .login  = async  function (req, res ) {  try {     var  user = req.session .user ;     if  (!user) {       res.render ('login' , {});     } else  {       res.redirect ('/' );     }   }catch  (exp){     log.error ('controller login error:'  + exp);     res.render ('login' , {});   } }; 
渲染后返回HTML字符串 1 2 3 4 var  listStr = fs.readFileSync (__dirname+"/../views/page/" +fname+"/" +fname+"L.html" ,"utf8" )var  listHtml = ejs.render (listStr, {list : result.list });var  pageStr = fs.readFileSync (__dirname+"/../views/page/page.html" ,"utf8" )var  pageHtml = ejs.render (pageStr, {data : result.data });
HTML替换 1 $("#downPage" ).html (data.pageHtml ); 
Bootstrap Modal-dialog 1. 使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <script  src ="js/jquery-1.11.1.min.js" > </script > <link  href ="css/bootstrap.css"  rel ='stylesheet'  type ='text/css'  /> <script  src ="js/bootstrap.js" > </script > <div  class ="modal fade"  id ="editModal"  tabindex ="-1"  role ="dialog"  aria-hidden ="true"  style ="display: none;" >     <div  class ="modal-dialog"  role ="document" >          <div  class ="modal-content modal-info" >              <div  class ="modal-header" >                  <button  type ="button"  class ="close"  data-dismiss ="modal"  aria-label ="Close" > <span  aria-hidden ="true" > ×</span > </button >              </div >              <div  class ="modal-body" >                  <form  id ="editForm"  action ="mail"  method ="post" >                      <input  id ="id"  name ="id"  hidden >                      <div  class ="bottom-form" >                          <div  class ="col-md-3 grid-form" >                              <h5 > 类别</h5 >                          </div >                          <div  class ="col-md-9 grid-form1" >                              <input  id ="rewardType"  name ="rewardType"  type ="text" >                          </div >                          <div  class ="clearfix" > </div >                      </div >                      <div  class ="bottom-form" >                          <div  class ="col-md-3 grid-form" >                              <h5 > 日期</h5 >                          </div >                          <div  class ="col-md-9 grid-form1" >                              <input  id ="date"  name ="date"  class ="form_date"  type ="text"  required  readonly >                          </div >                          <div  class ="clearfix" > </div >                      </div >                      <div  class ="bottom-form" >                          <div  class ="col-md-3 grid-form" >                              <h5 > 描述</h5 >                          </div >                          <div  class ="col-md-9 grid-form1" >                              <textarea  id ="content"  name ="content" > </textarea >                          </div >                          <div  class ="clearfix" > </div >                      </div >                      <div  class ="bottom-form" >                          <div  class ="col-md-9 grid-form1" >                              <button  type ="submit"  class ="btn btn-sm btn-primary"  id ="editSubmit" > 保存</button >                              <button  type ="reset"  class ="btn btn-sm btn-default"  data-dismiss ="modal" > 关闭</button >                          </div >                          <div  class ="clearfix" > </div >                      </div >                  </form >              </div >          </div >      </div >  </div > <a  href ="#"  style ="line-height: 0.5em;"  class ="btn btn-sm btn-primary"  data-toggle ="modal"  data-target ="#editModal"  onclick ="editShow(<%= i %>)" > 编辑</a > $('#editModal').modal('hide'); 
BootstrapValidator 1. 使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <script  src ="js/jquery-1.11.1.min.js" > </script > <link  href ="css/bootstrap.css"  rel ='stylesheet'  type ='text/css'  /> <script  src ="js/bootstrap.js" > </script > <link  href ="css/bootstrapValidator.css"  rel ="stylesheet" > <script  src ="js/bootstrapValidator.js" > </script > <input  id ="id"  name ="id"  type ="number"  required > //移除上次的校验配置 if($("#editForm").data('bootstrapValidator')) {   $("#editForm").data('bootstrapValidator').destroy();   $('#editForm').data('bootstrapValidator', null); } $('#editForm')   .bootstrapValidator()   .on('success.form.bv', function(e) {     e.preventDefault();     var $form = $(e.target);     //是否通过校验     if($form.data('bootstrapValidator').isValid()){       $.post($form.attr('action'), $form.serialize(), function(result) {         console.log(result);         $('#editModal').modal('hide');         listShow(); // 刷新列表       }, 'json');     }   }); 
DateTimePicker 1. 使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <script  src ="js/jquery-1.11.1.min.js" > </script > <link  href ="css/bootstrap.css"  rel ='stylesheet'  type ='text/css'  /> <script  src ="js/bootstrap.js" > </script > <link  href ="css/bootstrap-datetimepicker.min.css"  rel ="stylesheet"  media ="all" > <script  src ="js/bootstrap-datetimepicker.min.js" > </script > <div  class ="bottom-form" >     <div  class ="col-md-3 grid-form" >          <h5 > 开始时间</h5 >      </div >      <div  class ="col-md-9 grid-form1" >          <input  id ="startTime"  name ="startTime"  class ="form_datetime"  type ="text"  required  readonly >      </div >      <div  class ="clearfix" > </div >  </div > $('.form_datetime').datetimepicker({   format: 'yyyy-mm-dd hh:ii', // 格式   minView: 0, // 最小时间界面 0 分钟;1 小时;2 日期    weekStart: 1,   todayBtn:  1,   autoclose: 1,   todayHighlight: 1,   startView: 2, // 起始时间界面 0 分钟;1 小时;2 日期    forceParse: 0,   showMeridian: 1 }).on('hide',function(e) {   // 当日期选择框关闭时,执行刷新校验;与bootstrapValidator一起使用时需要注意的点   $('#editForm').data('bootstrapValidator')     .updateStatus('startTime', 'NOT_VALIDATED',null)     .validateField('startTime')     .updateStatus('endTime', 'NOT_VALIDATED',null)     .validateField('endTime'); }); 
其他知识点 CoffeeScript 1. 是一门编译到 JavaScript 的小巧语言 CoffeeScript 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 number   = 42  opposite = true  number = -42  if  opposite square  = (x)  ->list = [1 , 2 , 3 , 4 , 5 ] math =   root:   Math .sqrt   square: square   cube:   (x)  -> race  = (winner, runners...)  ->  print  winner, runners alert "I knew it!"  if  elvis? cubes = (math.cube num for  num in  list) 
编译后输出的 JavaScript 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 var  cubes, list, math, num, number, opposite, race, square,      __slice = [].slice ; number = 42 ; opposite = true ; if  (opposite) {  number = -42 ; } square = function (x ) {   return  x * x; }; list = [1 , 2 , 3 , 4 , 5 ]; math = {   root : Math .sqrt ,   square : square,   cube : function (x ) {     return  x * square (x);   } }; race = function (   var  runners, winner;   winner = arguments [0 ], runners = 2  <= arguments .length  ? __slice.call (arguments , 1 ) : [];   return  print (winner, runners); }; if  (typeof  elvis !== "undefined"  && elvis !== null ) {  alert ("I knew it!" ); } cubes = (function (   var  _i, _len, _results;   _results = [];   for  (_i = 0 , _len = list.length ; _i < _len; _i++) {     num = list[_i];     _results.push (math.cube (num));   }   return  _results; })(); 
2. 安装 1 cnpm install -g coffee-script 
3. 用法 官网 
运行 coffee 命令以执行脚本, 编译 .coffee 文件到 .js 文件, 和提供一个交互式的 REPL
1 coffee --compile --output lib/ src/ 
基础知识点 GZIP和BASE64的解压解密 1. GZIP解压 使用pako 
1 <script  src ="resources/js/pako.min.js"  charset ="utf-8" > </script > 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var  pako = window .pako ;var  xhr = new  XMLHttpRequest ();xhr.open ('GET' , url + '?'  + para, true ); xhr.responseType  = 'arraybuffer' ; xhr.onload  = function (e ) {   if  (this .status  == 200 ) {     var  arrayBuffer = xhr.response ;      if  (arrayBuffer) {       var  byteArray = new  Uint8Array (arrayBuffer);       var  json = pako.inflate (byteArray, { to : 'string'  });       json = base64.decode (json);       json = JSON .parse (json);     }   } }; xhr.send (); 
2. BASE64解密 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 function  Base64 (         _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;          this .encode  = function  (input ) {         var  output = "" ;         var  chr1, chr2, chr3, enc1, enc2, enc3, enc4;         var  i = 0 ;         input = _utf8_encode (input);         while  (i < input.length ) {             chr1 = input.charCodeAt (i++);             chr2 = input.charCodeAt (i++);             chr3 = input.charCodeAt (i++);             enc1 = chr1 >> 2 ;             enc2 = ((chr1 & 3 ) << 4 ) | (chr2 >> 4 );             enc3 = ((chr2 & 15 ) << 2 ) | (chr3 >> 6 );             enc4 = chr3 & 63 ;             if  (isNaN (chr2)) {                 enc3 = enc4 = 64 ;             } else  if  (isNaN (chr3)) {                 enc4 = 64 ;             }             output = output +                 _keyStr.charAt (enc1) + _keyStr.charAt (enc2) +                 _keyStr.charAt (enc3) + _keyStr.charAt (enc4);         }         return  output;     }          this .decode  = function  (input ) {         var  output = "" ;         var  chr1, chr2, chr3;         var  enc1, enc2, enc3, enc4;         var  i = 0 ;         input = input.replace (/[^A-Za-z0-9\+\/\=]/g , "" );         while  (i < input.length ) {             enc1 = _keyStr.indexOf (input.charAt (i++));             enc2 = _keyStr.indexOf (input.charAt (i++));             enc3 = _keyStr.indexOf (input.charAt (i++));             enc4 = _keyStr.indexOf (input.charAt (i++));             chr1 = (enc1 << 2 ) | (enc2 >> 4 );             chr2 = ((enc2 & 15 ) << 4 ) | (enc3 >> 2 );             chr3 = ((enc3 & 3 ) << 6 ) | enc4;             output = output + String .fromCharCode (chr1);             if  (enc3 != 64 ) {                 output = output + String .fromCharCode (chr2);             }             if  (enc4 != 64 ) {                 output = output + String .fromCharCode (chr3);             }         }         output = _utf8_decode (output);         return  output;     }          _utf8_encode = function  (string ) {         string = string.replace (/\r\n/g ,"\n" );         var  utftext = "" ;         for  (var  n = 0 ; n < string.length ; n++) {             var  c = string.charCodeAt (n);             if  (c < 128 ) {                 utftext += String .fromCharCode (c);             } else  if ((c > 127 ) && (c < 2048 )) {                 utftext += String .fromCharCode ((c >> 6 ) | 192 );                 utftext += String .fromCharCode ((c & 63 ) | 128 );             } else  {                 utftext += String .fromCharCode ((c >> 12 ) | 224 );                 utftext += String .fromCharCode (((c >> 6 ) & 63 ) | 128 );                 utftext += String .fromCharCode ((c & 63 ) | 128 );             }         }         return  utftext;     }          _utf8_decode = function  (utftext ) {         var  string = "" ;         var  i = 0 ;         var  c = c1 = c2 = 0 ;         while  ( i < utftext.length  ) {             c = utftext.charCodeAt (i);             if  (c < 128 ) {                 string += String .fromCharCode (c);                 i++;             } else  if ((c > 191 ) && (c < 224 )) {                 c2 = utftext.charCodeAt (i+1 );                 string += String .fromCharCode (((c & 31 ) << 6 ) | (c2 & 63 ));                 i += 2 ;             } else  {                 c2 = utftext.charCodeAt (i+1 );                 c3 = utftext.charCodeAt (i+2 );                 string += String .fromCharCode (((c & 15 ) << 12 ) | ((c2 & 63 ) << 6 ) | (c3 & 63 ));                 i += 3 ;             }         }         return  string;     } } var  base64 = new  Base64 ();function  urlEncode (param, key, encode ) {  if (param==null ) return  '' ;   var  paramStr = '' ;   var  t = typeof  (param);   if  (t == 'string'  || t == 'number'  || t == 'boolean' ) {       paramStr += '&'  + key + '='  + ((encode==null ||encode) ? encodeURIComponent (param) : param);   } else  {       for  (var  i in  param) {           var  k = key == null  ? i : key + (param instanceof  Array  ? '['  + i + ']'  : '.'  + i);           paramStr += urlEncode (param[i], k, encode);       }   }   return  paramStr; } 
Ajax实现跨域访问的三种方法 1. 处理跨域的方法1 – 代理 比如在北京(www.beijing.com/sever.php)和上海(www.shanghai.com/sever.php)各有一个服务器,北京的后端(www.beijing.com/sever.php)直接访问上海的服务,然后把获取的响应值返回给前端。也就是北京的服务在后台做了一个代理,前端只需要访问北京的服务器也就相当与访问了上海的服务器。这种代理属于后台的技术。 
2. 处理跨域的方法2 – JSONP 假设在http://www.aaa.com/index.php这个页面中向http://www.bbb.com/getinfo.php提交GET请求,那么我们在www.aaa.com页面中添加如下代码: 
1 2 3 4 var  eleScript= document .createElement ("script" ); eleScript.type  = "text/javascript" ;  eleScript.src  = "http://www.bbb.com/getinfo.php" ;  document .getElementsByTagName ("HEAD" )[0 ].appendChild (eleScript); 
当GET请求从http://www.bbb.com/getinfo.php返回时,可以返回一段JavaScript代码,这段代码会自动执行,可以用来负责调用http://www.aaa.com/index.php页面中的一个callback函数。看下面一个例子: 
在www.aaa.com页面中: 
1 2 3 4 5 6 <script >   function  jsonp ( json  ){     document .write ( json.name  );     } </script > <script  src ="http://www.bbb.com/getinfo.php" > </script > 
在www.bbb.com页面中: 
1 jsonp ({ "name" :"周星驰" ,"age" :45  });
也就是在www.aaa.com页面中声明,在www.bbb.com页面中调用。但是JSONP只支持  “GET” 请求,但不支持 “POST” 请求。
3. 处理跨域的方法3 – XHR2(推荐方法) “XHR2” 全称 “XMLHttpRequest Level2” 是HTML5提供的方法,对跨域访问提供了很好的支持,并且还有一些新的功能。
IE10以下的版本都不支持 
只需要在服务器端头部加上下面两句代码: 
1 2 header ( "Access-Control-Allow-Origin:*"  );header ( "Access-Control-Allow-Methods:POST,GET"  );
关于 “XHR2” 的更多信息大家可以查看官方文档
JavaScript混淆和反混淆工具 1. 混淆工具: 
YUI Compressor 
Google Closure Compiler  
UglifyJS  
JScrambler 
 
2. 反混淆工具: 
Thymeleaf里面的th和Spring Security结合进行页面权限配置 1 2 3 4 <li  th:if ="${#authorization.expression('!isAuthenticated()')}" >        <a  href ="#"  data-toggle ="modal"          data-target ="#changePasswordModal" > 修改密码</a > </li >