前端代码小技巧

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

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

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

相关推荐
daols883 分钟前
vue 实现基于 vxe-table 构建多维度产品对比表
前端·javascript·vue.js
前端 贾公子6 分钟前
第08章:中间件(5)
服务器·前端·javascript
tech_zjf1 小时前
当 AI 把 Next.js Route 越写越快:我为什么做了 next-route-kit
前端·后端
常宇佳1 小时前
vue3 @代指src路径设置
前端·typescript·vue
砚凝霜1 小时前
软考网络工程师|案例分析:Eth‑Trunk 链路聚合、iStack 堆叠、CSS 集群核心考点总结
前端·css·网络
珐恩AI-人工智能1 小时前
大模型意图召回偏差分析:GEO如何解决“有收录却不触发问答曝光”的难题
大数据·前端·人工智能·html·流量运营·geo优化
程序员老赵2 小时前
Docker 部署禅道 ZenTao:轻松搭建研发项目管理平台
前端·后端·github
前端小卡拉2 小时前
用了大半年 AI 编程工具,我才搞懂 Skill 到底是什么
前端·javascript
hunterandroid2 小时前
[鸿蒙从零到一] HarmonyOS 单元测试与 UI 自动化测试实战:从代码质量到用户体验的全链路保障
前端
郭邯2 小时前
用 Intl.DateTimeFormat 手写一个时区转换器,顺便聊聊我和 AI 结对编程的日常
前端·javascript