前端代码小技巧

工作中经常会遇到一些小功能,可能需要些小技巧,掌握这些小技巧,可以有效的帮助实现业务功能,当然这些小技巧基本网上都有。

实现一个简单字符串加密,解密算法

利用charCodeAt获取字符的 Unicode 码,通过增加、减少偏移量进行加密解密。需要注意的是,超过 Unicode 码范围时需要循环到范围内(Unicode 码位范围是从 0 到 0x10FFFF , javascript 能处理的范围是 0 到 0xFFFF )

scss 复制代码
function encode(str, padding = 5) {
  return !str ? str : str.split('').map(function(s) {
    var code = s.charCodeAt() + padding;
    if (code > 0xFFFF) {
      code = code - 0x10000;
    }
    return String.fromCharCode(code);
  }).join('');
}

function decode(str, padding = 5) {
  return !str ? str : str.split('').map(function(s) {
    var code = s.charCodeAt() - padding;
    if (code < 0) {
      code = code + 0x10000;
    }
    return String.fromCharCode(code);
  }).join('');
}

encode('javascript')  // 'of{fxhwnuy'
decode('of{fxhwnuy')  // 'javascript'

短横命名与驼峰命名转换

运用正则表达式 /(\w)(_)(\w)/g , 需要运用()分组来提前字符

javascript 复制代码
function toCamel(str) {
  return str.replace(/(\w)(_)(\w)/g,( match,$1,$2,$3 )=> `${$1}${$3.toUpperCase()}`)
}
function toDash(str) {
  return str.replace(/([a-z])([A-Z])/g,( match,$1,$2 )=> `${$1}_${$2.toLowerCase()}`)
}

toCamel('my_first_name')  // 'myFirstName'
toDash('myFirstName')     // 'my_first_name'

给数字添加千分位

运用正则表达式 /\B(?=(\d{3})+(?!\d))/g , 匹配每个位置后面都只有三个数字的组合,不能再有多余数字

scss 复制代码
function addThousandSeparator(num) {
  var numParts = num.toString().split(".");
  numParts[0] = numParts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  return numParts.join(".");
}

addThousandSeparator('12345678.12') // '12,345,678.12'
// 第一次匹配成功的结果,找到 2 3 之间的位置,后面跟着 345 678 符合只有三个数字组合
// 第二次匹配成功的结果,找到 5 6 之间的位置,后面跟着 678 符合只有三个数字组合

国际化Api

javascript 复制代码
const numberFormat = new Intl.NumberFormat('en-US');
numberFormat.format('12345678.12') // '12,345,678.12'

实现一个函数 where,它返回它被调用的时候所在的函数的名字。

正则表达式匹配 at xxx ( 第一个是 where 函数,第二个是调用where的函数

javascript 复制代码
function where() {
  let reg = /\s+at\s(\S+)\s\(/g;
  let str = new Error().stack.toString();
  let res = reg.exec(str) && reg.exec(str);
  return res && res[1];
}

const func = ()=>{
    console.log(where())  // func
}
func()

使用 Promise 实现防止重复请求

javascript 复制代码
const preventReqMore = (fn, p = null) => {
  return (...argv) => {
    p = p ? p : fn(...argv).finally(() => {
        p = null 
    })
    return p
  }
}
// 可以简写成一行
// const preventReqMore = (fn, p = null) => (...argv) => p ? p : (p = fn(...argv).finally(() => (p = null)))

let fetchReq = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('Request completed');
      resolve();
    }, 1000);
  });
};
let fetchReqPrevented = preventReqMore(fetchReq);
fetchReqPrevented();  
fetchReqPrevented();  // 会被阻止,不会发起请求

Todo 持续更新

相关推荐
悦涵仙子15 分钟前
vueuse中的useTemplateRefsList
前端·javascript·vue.js
萧萧玉树16 分钟前
分布式在线评测系统
前端·c++·后端·负载均衡
haima9542 分钟前
ubuntu安装chrome无法打开问题
前端·chrome
放逐者-保持本心,方可放逐1 小时前
XSS 与 CSRF 记录
前端·xss·csrf·浏览器安全
徊忆羽菲1 小时前
利用HTML5和CSS来实现一个漂亮的表格样式
前端·css·html5
不爱说话郭德纲1 小时前
Stylus、Less 和 Sass 的使用与区别
前端·css·面试·less·sass·stylus
凄凄迷人1 小时前
如何调试 chrome 崩溃日志(MAC)
前端·chrome·macos·crash
蒙特网站1 小时前
网站布局编辑器前端开发:设计要点与关键考量
前端·javascript·学习·html
理想不理想v1 小时前
前端开发工程师需要学什么?
java·前端·vue.js·webpack·node.js
fhf1 小时前
感觉根本等不到35岁AI就把我裁了
前端·人工智能·程序员