各种业务开发都离不开对数据的处理,然而遇到的很多数据都是不好处理的。这个时候就需要寻求搜索引擎的帮助。这种方法效率是非常低下的,而且根据作者的个性不能保证其对自己的口味。因此这篇文字包含了一份 JS 常用业务函数手册,例如时间格式的处理、用的是哪个手机浏览器,手机号、邮箱的验证,以此来提高你的开发效率

常用 JS 函数

1.时间格式化

界面展示的时间千变万化, 所以一个处理时间的函数,它的重要性就不言而喻了。

  1. export function formatDate (oldDate, fmt) {
  2. let date = new Date()
  3. if (typeof oldDate === 'string' || typeof oldDate === 'number') {
  4. date = new Date(+oldDate)
  5. } else {
  6. date = oldDate
  7. }
  8. if (/(y+)/.test(fmt)) {
  9. fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) }
  10. let o = {
  11. 'M+': date.getMonth() + 1,
  12. 'd+': date.getDate(),
  13. 'h+': date.getHours(),
  14. 'm+': date.getMinutes(),
  15. 's+': date.getSeconds() }
  16. function padLeftZero (str) {
  17. return ('00' + str).substr(str.length)
  18. }
  19. for (let k in o) {
  20. if (new RegExp(`(${k})`).test(fmt)) {
  21. let str = o[k] + ''
  22. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
  23. }
  24. }
  25. return fmt
  26. }

formatDate 接受俩个参数, oldDate 类型可以是 Date,String,Number。因为现在用时间戳传递时间真的是蛮多,也蛮方便的,而JS 是一门弱类型语言,所以我将 String 和 Number 类型的数据统一当做时间戳来处理。 fmt 是格式化的类型:yyyy-MM-dd hh:mm,其中的 yyyy | MM | dd | hh | mm 是分别匹配 年 | 月 | 日 | 时 | 分 的关键字。其中的连字符是可以随意替换的,只展示年月将其他关键字去掉即可。举几个例子:

  • yyyy年MM月dd -> 2019年09月7日
  • hh分mm秒 -> 16分53秒

2.以“天”为单位获取响应的时间戳

通常都会获取三天前的时间,12 个以内的数据,24 小时以内的数据,因此我弄了一个以天为单位获取时间戳的函数

  1. export function setDate(num) { return Date.now() + num * 24 * 60 * 60 * 1000}

时间为正可以获得未来的时间,时间为负可以获得过去时间。举个例子

  • 12 个小时之前的时间 -> setDate(-.5)
  • 24 个小时之前的时间 -> setDate(-1)
  • 三天后的时间 -> setDate(3)

3.获取 URL 中的参数

这个需求在三大框架的时代应用貌似不多了,不过面试中问的还是蛮多的,了解一下是好的

简单实现

  1. var urlParams = new URLSearchParams('?post=1234&action=edit');
  2. console.log(urlParams.get('action')); // "edit"

看了一下浏览器支持情况还是蛮好的,除了万恶的 ie

复杂实现

  1. function getUrlParams(param){
  2. // 有赖于浏览器环境, window.location.search 是浏览器函数
  3. // 意思是:设置或返回从问号 (?) 开始的 URL(查询部分)。
  4. var query = window.location.search.substring(1);
  5. var vars = query.split("&");
  6. for (var i=0;i<vars.length;i++) {
  7. var pair = vars[i].split("=");
  8. if(pair[0] == param){return pair[1];}
  9. }
  10. return(false);
  11. }

举个例子: http://xuyuechao.top?a=3&b=5&c=8888

  • getUrlParams('a') -> 3
  • getUrlParams('b') -> 5
  • getUrlParams('c') -> 8888

4.手机端判断浏览器类型

  1. BrowserInfo = {
  2. isAndroid: Boolean(navigator.userAgent.match(/android/ig)),
  3. isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)),
  4. isIpad: Boolean(navigator.userAgent.match(/ipad/ig)),
  5. isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)),
  6. isAli: Boolean(navigator.userAgent.match(/AlipayClient/ig)),
  7. isPhone: Boolean(/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent))
  8. }

目前主要支持 安卓 & 苹果 & ipad & 微信 & 支付宝 & 是否是手机端。

5. 数组降维

二维数组

  1. let arr = [ [1], [2], [3] ]
  2. arr = Array.prototype.concat.apply([], arr); // [1, 2, 3]

多维数组降维

  1. let arr = [1, 2, [3], [[4]]]
  2. arr = arr.flat(3) // [1, 2, 3, 4]

flat 有兼容性问题,手机端问题不大。浏览器端不兼容 edge。填 Infinity 可展开任意深度的数组

6.深拷贝

使用变量 a 拷贝对象 b,改变 a 中的值 b 中的值也会跟着改变,这叫做浅拷贝。要想让 a 独立于 b 就需要深拷贝

简易处理

  1. function deepClone() {
  2. return JSON.parse(JSON.stringify(obj))
  3. }

既然是简易处理就有他的不足,上面主要是用了 JSON 的序列化和反序列化。而 JSON 是不支持函数和 undefined 的因此碰到这些情况会缺失,但是已经能够满足大部分情况了

复杂处理

复杂处理就需要采用递归的方式了

  1. function deepClone(obj) {
  2. function isClass(o) {
  3. if (o === null) return "Null";
  4. if (o === undefined) return "Undefined";
  5. return Object.prototype.toString.call(o).slice(8, -1);
  6. }
  7. var result;
  8. var oClass = isClass(obj);
  9. if (oClass === "Object") {
  10. result = {};
  11. } else if (oClass === "Array") {
  12. result = [];
  13. } else {
  14. return obj;
  15. }
  16. for (var key in obj) {
  17. var copy = obj[key];
  18. if (isClass(copy) == "Object") {
  19. result[key] = arguments.callee(copy);//递归调用
  20. } else if (isClass(copy) == "Array") {
  21. result[key] = arguments.callee(copy);
  22. } else {
  23. result[key] = obj[key];
  24. }
  25. }
  26. return result;
  27. }

7. 防抖 & 节流

防抖和节流属于高阶技巧,业务中比较多见的场合也就是搜索内容改变提示信息。即使不加也也不一定能看出区别,但是加了新手维护代码可能会崇拜你哦。

防抖

  1. function debounce(func, wait) {
  2. let timeout;
  3. return function () {
  4. let context = this;
  5. let args = arguments;
  6. if (timeout) clearTimeout(timeout);
  7. timeout = setTimeout(() => {
  8. func.apply(context, args)
  9. }, wait);
  10. }
  11. }

节流

  1. function throttle(func, wait) {
  2. let previous = 0;
  3. return function() {
  4. let now = Date.now();
  5. let context = this;
  6. let args = arguments;
  7. if (now - previous > wait) {
  8. func.apply(context, args);
  9. previous = now;
  10. }
  11. }
  12. }

8. 获取数组极值

  1. function smallest(array){
  2. return Math.min.apply(Math, array);
  3. }
  4. function largest(array){
  5. return Math.max.apply(Math, array);
  6. }
  7. smallest([0, 1, 2.2, 3.3]); // 0
  8. largest([0, 1, 2.2, 3.3]); // 3.3

感谢岁月无影的评论,再此补充用 es6 的实现方式

  1. let list = [1, 2, 3, 4, 5]
  2. Math.max(...list) // 5
  3. Math.min(...list) // 1

9.判断小数是否相等

  1. function epsEqu(x,y) {
  2. return Math.abs(x - y) < Math.pow(2, -52);
  3. }
  4. // 举例
  5. 0.1 + 0.2 === 0.3 // false
  6. epsEqu(0.1 + 0.2, 0.3) // true

感谢 IAmFineThanks 提供的 Number.EPSILON ,Number.EPSILON === Math.pow(2, -52)因此上述方法也可以这么写

  1. function epsEqu(x,y) {
  2. return Math.abs(x - y) < Number.EPSILON;
  3. }

用户输入的是十进制数字,计算机保存的是二进制数。所以计算结果会有偏差,所以我们不应该直接比较非整数,而是取其上限,把误差计算进去。这样一个上限称为 machine epsilon,双精度的标准 epsilon 值是 2^-53 (Math.pow(2, -53))

总结:

文中的代码可能不一定是最优代码,要是你有更好的代码欢迎评论。

参考资料:

www.jianshu.com/p/c8b86b09d…

www.cnblogs.com/wxydigua/p/…

blog.csdn.net/u014607184/…

rockjins.js.org/2017/02/15/…

一些让 JS 更优雅 / 易读的小技巧

对于工程师来说,代码是写一遍、修改很多遍、阅读更多遍的重要产出,可读性至关重要,所以高可读代码的重要性不言而喻。

1.用对象代替 switch / if

  1. 公共内容:
  2. let a = 'VIP'
  3. 场景 1
  4. if (a === 'VIP') {
  5. return 1
  6. } else if (a === 'SVIP') {
  7. return 2
  8. }
  9. 场景 2
  10. switch(a) { // 感谢 红山老六 的评论指出这部分代码的 bug。现已改正
  11. case 'VIP':
  12. return 1
  13. case 'SVIP':
  14. return 2
  15. }
  16. 场景 3
  17. let obj = {
  18. VIP: 1,
  19. SVIP: 2
  20. }

这里只是提供了一种方式,具体的使用场景还是要你自己判断。我用的比较多的一个场景是状态映射中文含义,例如支付状态通常获取的是 1, 2,3,4 这种值,但是列表要求显示相应的中文状态 未支付 | 支付中 | 已退款等等

2. || 和 && 的妙用

  1. // 场景 1
  2. function b(a) {
  3. if (a) {
  4. return a
  5. } else {
  6. return ''
  7. }
  8. }
  9. // 场景 2
  10. function b(a) {
  11. return a || ''
  12. }

上面是 || 的用法,也叫做短路处理。常见于 if 条件中,但是他其实也可以直接用于语句中。当第一个参数为 true 就会取第一个参数的值,当第一个参数不为 true 就会取第二个参数的值。&& 正好与 || 相反。第一个参数 为 true 会取第二个参数的值

常用 JS 函数的更多相关文章

  1. 原生JS研究:学习jquery源码,收集整理常用JS函数

    原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...

  2. api日常总结:前端常用js函数和CSS常用技巧

    我的移动端media html{font-size:10px} @media screen and (min-width:321px) and (max-width:375px){html{font- ...

  3. web前端关于html转义符的常用js函数

    web前端关于html转义符的常用js函数 //去掉html标签 function removeHtmlTab(tab) { return tab.replace(/<[^<>]+? ...

  4. 基础常用JS函数和语法

    100多个基础常用JS函数和语法集合大全  来源:http://www.cnblogs.com/hnyei/p/4605103.html 网站特效离不开脚本,javascript是最常用的脚本语言,我 ...

  5. 100多个基础常用JS函数和语法集合大全

    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为//3.传统 ...

  6. 一些常用JS函数和技巧总结

    1.JS原生函数parseInt(),返回字符串的第一个数字,默认是十进制. 2.!!data.success  //强制转换成布尔类型

  7. 各种常用js函数实现

    1.bind function bind(fn, context) {    var args = Array.prototype.slice.call(arguments, 2);    retur ...

  8. 常用js函数整理--common.js

    var h = {}; h.get = function (url, data, ok, error) { $.ajax({ url: url, data: data, dataType: 'json ...

  9. 一些常用JS 函数总结

    搜索url参数 /** * 搜索url参数 * @param {String} name 参数键名 * @return {String} 对应值 */ function getQueryVariabl ...

随机推荐

  1. Java学习|HTTP请求头

    https://www.cnblogs.com/honghong87/articles/6941436.html 常见http请求报文头属性      Accept:告诉服务端,客户端接受什么类型的响 ...

  2. HashMap与ConcurrentHashMap在Java8的改进

    链接:http://www.cnblogs.com/huaizuo/archive/2016/04/20/5413069.html#undefined http://www.cnblogs.com/h ...

  3. 2015-11-13 linux基础笔记

    1.安装linux 使用光盘,版本CENSOS6.6 2.命令过长请使用\  后enter键换行转义  直到不需要转义后回车运行 3.linux 大小写敏感 4.显示terminal 输出语言  ec ...

  4. MySQL主从配置图文详解

    #环境配置#master IP:192.168.46.137 slave IP:192.168.46.138 database:v1 1.在两台机器,分别安装mysql数据库,分别添加远程连接权限 2 ...

  5. GUID做主键真的合适吗

    在一个分布式环境中,我们习惯使用GUID做主键,来保证全局唯一,然后,GUID做主键真的合适吗? 其实GUID做主键本身没有问题,微软的很多项目自带DB都是使用GUID做主键的,显然,这样做是没有问题 ...

  6. 解决npm报错:Module build failed: TypeError: this.getResolve is not a function

    1.sass-loader的版本过高导致的编译错误,当前最高版本是8.x,需要退回到7.3.1 运行: npm uninstall sass-loader --save-dev(卸载当前版本) npm ...

  7. Java内部类使用注意事项

    Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class La ...

  8. MySQL5.7.27报错[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated

    mysql5.7.27在运行更新语句时出现如下情况,mysql5.6之前没有这种情况出现. of ORDER BY clause is not in GROUP BY clause and conta ...

  9. NLP(十六) DL在NLP中的应用

    深度学习中的核心主题是卷积神经网络(CNN)和循环神经网络(RNN) 卷积神经网络 CNN用于图像处理 卷积: 原始图像 5×5 滤波器 3×3 滤波器以步长大于小于1,到处平移,并与原始图像里的3× ...

  10. hihocoder #1616 : 是二叉搜索树吗?(模拟题)

    题目链接:http://hihocoder.com/problemset/problem/1616 题解:就是简单的模拟一下至于如何判断是不是二叉搜索树可以通过中序遍历将每个点存下来看是不是递增的如果 ...