记录开发中的字符串与日期处理的方法
技巧及有趣的方法 操作Date 检查日期是否有效 1 2 const isDateValid = (...val ) => !Number .isNaN(new Date (...val).valueOf());isDateValid("December 17, 1995 03:24:00" );
计算两个日期之间的间隔 1 2 const dayDif = (date1, date2 ) => Math .ceil(Math .abs(date1.getTime() - date2.getTime()) / 86400000 ) dayDif(new Date ("2021-11-3" ), new Date ("2022-2-1" ))
距离过年还有90天~
查找日期位于一年中的第几天 1 2 const dayOfYear = (date ) => Math .floor((date - new Date (date.getFullYear(), 0 , 0 )) / 1000 / 60 / 60 / 24 );dayOfYear(new Date ());
2021年已经过去300多天了~
时间格式化 时间转化为hour:minutes:seconds的格式 1 2 3 4 const timeFromDate = date => date.toTimeString().slice(0 , 8 ); timeFromDate(new Date (2021 , 11 , 2 , 12 , 30 , 0 )); timeFromDate(new Date ());
js判断
instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上
1 2 const Router = require ('Koa-router' )if (router instanceof Router)
提供 function 给外部调用 1 2 3 4 5 6 7 8 9 window .init = function init (configs ) { Vue.prototype.configs = configs; new Vue({ render: (h ) => h(App), }).$mount("#app" ); }; init();
调试骚技巧 1 2 3 4 5 6 7 mounted ( ) { window .vue = this } window .wang = "wang"
简化事件赋值写法
对于某些事件只需简单的赋值可不写 methods,多个赋值可使用逗号 ,
$event子组件返回数据使用$event
1 2 3 4 5 6 7 8 @click="id=item.id,display=true" @input="time=$event" data ( ) { return { id:0 , display:false } }
时间戳转换 1 2 3 4 5 6 function format (timeStamp ) { let time = new Date (timeStamp); return `${new Date ().getFullYear()} -${ new Date ().getMonth() + 1 } -${new Date ().getDate()} ${new Date ().getHours()} :${new Date ().getMinutes()} :${new Date ().getSeconds()} ` ;}
常见new Date() 1 new Date ().setTime(new Date ().getTime() - 24 * 60 * 60 * 1000 )
查询当前 localStorage 存储大小 1 2 3 4 5 6 7 8 9 10 11 12 (function ( ) { if (!window .localStorage) { console .log("浏览器不支持localStorage" ); } var size = 0 ; for (item in window .localStorage) { if (window .localStorage.hasOwnProperty(item)) { size += window .localStorage.getItem(item).length; } } console .log("当前localStorage剩余容量为" + (size / 1024 ).toFixed(2 ) + "KB" ); })();
什么是 IIFE (立即调用的函数表达式) IIFE是一个立即调用的函数表达式,它在创建后立即执行
1 2 3 4 (function IIFE ( ) { console .log("Hello!" ); })();
点击回到顶部的 js 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 Gotop.onclick = function ( ) { if (c) { clearInterval (c); } c = setInterval (function ( ) { var target = 0 ; var step = 10 ; var curent = getScroll().scrollTop; if (curent > target) { step = -Math .abs(step); } curent += step; document .documentElement.scrollTop = curent; document .body.scrollTop = curent; if (Math .abs(curent) <= target) { clearInterval (c); document .documentElement.scrollTop = target; document .body.scrollTop = target; return ; } }, 2 ); }; function getScroll ( ) { return { scrollTop: document .documentElement.scrollTop || document .body.scrollTop, scrpllLeft: document .documentElement.scrpllLeft || document .body.scrollLeft, }; }
生成随机字符串 (可指定长度) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /** * 生成随机字符串(可指定长度) * @param len * @returns {string} */ randomString = function(len) { len = len || 8; var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/ var maxPos = $chars.length; var pwd = ''; for (var i = 0; i < len; i++) { pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; }
生成随机颜色值 1 2 3 4 5 6 7 8 9 function getRandomColor () { const rgb = [] for (let i = 0 ; i < 3; ++i){ let color = Math.floor(Math.random() * 256).toString(16) color = color.length == 1 ? '0' + color : color rgb.push(color) } return '#' + rgb.join('') }
city.json 城市 JSON 数据处理为级联组件适用的结构 1 2 3 4 5 6 7 8 9 10 11 12 13 Object .keys(City).forEach((city ) => { if (City[city].level === 1 ) { let tempArr = []; City[city].children.map((v ) => { tempArr.push({ id : City[v].id, name : City[v].name }); }); tempCity.push({ id: City[city].id, name: City[city].name, children: tempArr, }); } });
计算指定数字的阶乘
利用递归调用来进行数字的阶乘
1 2 3 4 5 6 7 8 9 10 11 const factorialOfNumber = (number ) => number < 0 ? (() => { throw new TypeError ("请输入正整数" ); })() : number <= 1 ? 1 : number * factorialOfNumber(number - 1 ); factorialOfNumber(4 ); factorialOfNumber(8 );
字符串反转 1 2 const reverseString = (string ) => [...string].reverse().join("" );reverseString(121245 );
1 2 3 4 5 6 7 8 let start = performance.now();let sum = 0 ;for (let i = 0 ; i < 100000 ; i++) { sum += 1 ; } let end = performance.now();console .log(start);console .log(end);
避免多条件并列
开发中有时会遇到多个条件,执行相同的语句,也就是多个||这种:
1 2 3 4 5 6 7 8 9 10 11 if (status==1 ||status==2 ||status==3 ){ doSomeThing() } switch (status){ case 1 : case :2 case :3 : doSomeThing() }
1 2 3 4 const enum = [1 , 2 , 3 ];if (enum.includes(status)) { doSomething(); }
||和&& 1 2 let wang = type || "wang" ; type && eval ((wang = "wang" ));
注解:&&后的为 function(函数),可直接执行,但如果是一些 js 逻辑却不能执行,这时可以使用 eval()欺诈
RGB 色值生成 16 进制色值 1 2 3 4 5 6 7 8 9 const rgb2Hex = rgb => { let rgbList = rgb.toString().match(/\d+/g) let hex = '#' for (let i = 0, len = rgbList.length; i < len; ++i) { hex += ('0' + Number(rgbList[i]).toString(16)).slice(-2) } return hex }; rgb2Hex('100, 50, 0') // '#643200'
使用|处理小数 1 2 3 console .log(10.9 | 0 ); console .log(-10.9 | 0 );
字符串转为对象取值(“obj.name”=>eval(obj.name)) 当使用某个变量作为对象的键值时,可用 obj.key 当变量为 name 作为键值时,可用以下方法
1 2 3 4 let obj = {}let key = "name" ;let val = "wang" eval (`obj.${key} = '${val} '` )=>eval ("obj.name = 'wang'" )
操作字符串 获取两个整数之间的随机整数 1 2 const random = (min, max ) => Math .floor(Math .random() * (max - min + 1 ) + min);random(1 , 50 );
将RGB转化为十六机制 1 2 const rgbToHex = (r, g, b ) => "#" + ((1 << 24 ) + (r << 16 ) + (g << 8 ) + b).toString(16 ).slice(1 );rgbToHex(255 , 255 , 255 );
获取随机十六进制颜色 1 2 const randomHex = () => `#${Math .floor(Math .random() * 0xffffff ).toString(16 ).padEnd(6 , "0" )} ` ;randomHex();
获取变量的类型 1 2 3 4 5 6 7 8 9 10 const trueTypeOf = (obj ) => Object .prototype.toString.call(obj).slice(8 , -1 ).toLowerCase();trueTypeOf('' ); trueTypeOf(0 ); trueTypeOf(); trueTypeOf(null ); trueTypeOf({}); trueTypeOf([]); trueTypeOf(0 ); trueTypeOf(() => {});
字符串首字母大写 1 2 const capitalize = str => str.charAt(0 ).toUpperCase() + str.slice(1 )capitalize("hello world" )
翻转字符串 1 2 const reverse = str => str.split('' ).reverse().join('' );reverse('hello world' );
随机字符串(nice)
tips:利用toString转换随机数但是有限制 在数字类型会失精,最终生产的随机数只有大概13位左右(此方法含小数点在第二位)
1 2 const randomString = () => Math .random().toString(36 ).slice(2 );randomString();
截断字符串为… 1 2 const truncateString = (string, length ) => string.length < length ? string : `${string.slice(0 , length - 3 )} ...` ;truncateString('Hi, I should be truncated because I am too loooong!' , 36 )
生成固定字符指定次数的字符串(N 个”XXX”) 1 2 3 4 Array (10 ).join(1 ); Array (3 ).join("a" ); "1" .repeat(3 ); "abc" .repeat(3 );
生成随机 0-N 的数组
时间 0 点到 23 点
1 [...new Array (24 ).keys()];
数字的修饰-每三位加一逗号
12000000.11 转化为 12,000,000.11
1 2 3 4 5 6 7 8 function commafy (num ) { return ( num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g , function ($1 , $2 ) { return $2 + "," ; }) ); }
字符串扩展 1 2 let word = "wang" ;let arr = [...word];
中英文判断字符串长度一致 1 2 3 4 5 6 let word = "w" ;let chzn = "王" ;console .log(word.length, chzn.length); let arr1 = [...word];let arr2 = [...chzn];console .log(arr1.length, arr2.length);
字符串首字母大写 1 2 3 4 5 let word = "wang" ;word = word[0 ].toUpperCase() + word.substr(1 ); console .log(word);
字符串正则匹配切割 1 2 3 const surname = "wang,li;zhang" ;const surnameArr = surname.split(/[,;]/ );console .log(surnameArr);
转换字节单位KB MB GB 1 2 3 4 5 6 7 8 9 10 11 12 13 const formatbyte = (value, type = 'GB' ) => { let k = 1024 let val = Number (value) if (val == 0 ) return '0 B' else if (!value) return value let sizes = ['B' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' , 'EB' , 'ZB' , 'YB' ] let unit = sizes.findIndex(i => i == type) if (unit) val = val * Math .pow(k, unit) let i = Math .floor(Math .log(val) / Math .log(k)) return (val / Math .pow(k, i)).toPrecision(4 ) + '' + sizes[i] } formatbyte(10000 ) => '9.766TB' formatbyte(0.22 ) => '225.3MB'
生成包含大小写字母和数字的随机字符串?
项目中,也许我们会遇到需要使用 JS 生成特定长度随机字符串的需求,比如用来做 Hash 值、uuid、随机码等,除了可以借助一些库和插件之外,其实部分场景下,我们完全可以自定义函数实现指定长度随机字符串 的生成。
简洁版函数只需要两行代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 function generateStr (len = 18 ) { var arr = [...new Array (62 )].map((item, i ) => String .fromCharCode(i + (i < 10 ? 0 : i < 36 ? 7 : 13 ) + 48 ) ); return [...new Array (len)] .map(() => arr[Math .floor(Math .random() * arr.length)]) .join('' ); } generateStr(18 );
如果担心重复,则可以添加一个Map来缓存已经生成的字符串,每次返回时判断一下:
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 const cacheMap = new Map (); const arr = [...new Array (62 )].map((item, i ) => String .fromCharCode(i + (i < 10 ? 0 : i < 36 ? 7 : 13 ) + 48 ) ); function generateStr (len = 18 ) { const str = [...new Array (len)] .map(() => arr[Math .floor(Math .random() * arr.length)]) .join('' ); if (cacheMap.has(str)) { console .log(cacheMap, str); return generateStr(len); } else { cacheMap.set(str, true ); return str; } } for (let i = 0 ; i < 20 ; i++) { generateStr(1 ); } console .log(cacheMap);