前端代码小技巧

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

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

利用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 持续更新

相关推荐
陈卓41027 分钟前
Redis-限流方案
前端·redis·bootstrap
顾林海36 分钟前
Flutter Dart 运算符全面解析
android·前端
七月丶43 分钟前
🚀 现代 Web 开发:如何优雅地管理前端版本信息?
前端
漫步云端的码农44 分钟前
Three.js场景渲染优化
前端·性能优化·three.js
悬炫1 小时前
赋能大模型:ant-design系列组件的文档知识库搭建
前端·ai 编程
用户108386386801 小时前
95%开发者不知道的调试黑科技:Apipost让WebSocket开发效率翻倍的秘密
前端·后端
稀土君1 小时前
👏 用idea传递无限可能!AI FOR CODE挑战赛「创意赛道」作品提交指南
前端·人工智能·trae
OpenTiny社区1 小时前
Node.js 技术原理分析系列 4—— 使用 Chrome DevTools 分析 Node.js 性能问题
前端·开源·node.js·opentiny
写不出代码真君2 小时前
Proxy和defineProperty
前端·javascript
乐坏小陈2 小时前
TypeScript 和 JavaScript:2025 年应该选择哪一个?【转载】
前端·javascript