JavaScript Hacks
JavaScript Hacks,很多都是在网上看到的,觉得好就记下来了。在这里给大家推荐一个项目,里面很多代码片段都值得学习https://github.com/Chalarangelo/30-seconds-of-code 持续补充
统计字符串中各个字符出现的次数
function repeatCount(str) {
return str.split('').reduce((pre, cur) => (pre[cur]++ || (pre[cur] = 1), pre), {})
}
var str = 'abcdaabc'
var info = repeatCount(str)
console.log(info) // { a: 3, b: 2, c: 2, d: 1 }
URL参数转 key/value
const fomartUrlParams = url =>
url.match(/([^?=&]+)(=([^&]*))/g).reduce(
(a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {}
)
fomartUrlParams('https://svend.cc/?name=gee1k&gender=man') // -> {name: "gee1k", gender: "man"}
格式化日期时间
const parseTime = (date, fmt) => {
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"S": date.getMilliseconds() //毫秒
}
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length))
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)))
return fmt
}
parseTime(new Date(), "yyyy-MM-dd")
parseTime(new Date(), "yyyy-MM-dd hh:mm:ss")
parseTime(new Date(), "hh:mm")
深度克隆
const deepClone = (source) => {
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'shallowClone')
}
const targetObj = source.constructor === Array ? [] : {}
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {}
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
}
}
return targetObj
}
deepClone({a: '1', b: 2})
阻止事件冒泡
function stopBubble(event){
if (event && event.stopPropagation) {
event.stopPropagation()
} else {
window.event.cancelBubble=true
}
}
防抖
const debounce = (func, wait, immediate) => {
let timeout, args, context, timestamp, result
const later = function() {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔last小于设定时间间隔wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function(...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
Demo:
const a = () => {console.log('debounce')}
const b = debounce(a, 1000)
setInterval(() => {b()}, 50 )
合并Object
const objectMerge = (target, ...source) => {
if (typeof target !== 'object') {
target = {}
}
source.forEach(src => {
for (const property in src) {
if (src.hasOwnProperty(property)) {
const srcProperty = src[property]
if (typeof srcProperty === 'object') {
target[property] = objectMerge(target[property], srcProperty)
continue
}
target[property] = srcProperty
}
}
})
return target
}
objectMerge({a:1, b: 22}, {a: 5,c: 3}, {s: 234, b: 222, h: {a: 1}}) // -> "{"a":5,"b":222,"c":3,"s":234,"h":{"a":1}}"
数组去重
const deleteDuplicate = arr => [...new Set(arr)]
deleteDuplicate([1, 2, 3, 4, 5, 1, 2, 3]) // -> [1, 2, 3, 4, 5]
数组平均数
const average = arr => arr.reduce((pre, cur) => pre + cur, 0) / arr.length
average([1,2,3]) // -> 2
大写每个单词的首字母【借鉴】
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase())
capitalizeEveryWord('hello world') // -> 'Hello World'
字符串首字母大写
const capitalize = (str, lowerOther = false) => str.slice(0, 1).toUpperCase() + (lowerOther ? str.slice(1).toLowerCase() : str.slice(1))
capitalize('helloWorld') // -> 'HelloWorld'
capitalize('helloWorld', true) // -> 'Helloworld'
检查回文【借鉴】
const palindrome = str => {
const s = str.toLowerCase().replace(/[\W_]/g,'')
return s === s.split('').reverse().join('')
}
palindrome('abc cba') // -> true
统计数组中值的出现次数【借鉴】
const countOccurrences = (arr, value) => arr.reduce((pre, cur) => cur === value ? pre + 1 : pre + 0, 0)
countOccurrences([1, 1, 2, 1, 2, 3], 1) // -> 3
获取两个数组之间的差集【借鉴】
const difference = (a, b) => {
const s = new Set(b)
return a.filter(x => !s.has(x))
}
difference([1,2,3], [1,2]) // -> [3]
斐波那契数组生成器【借鉴】
生成指定个数的斐波那契数组
const fibonacci = n => Array(n).fill(0).reduce((pre, cur, i) => pre.concat(i > 1 ? pre[i - 1] + pre[i - 2] : i), [])
fibonacci(5) // -> [0,1,1,2,3]
用 Rnage 初始化数组【借鉴】
const rangeArray = (end, start = 0) => Array.apply(null, Array(end - start)).map((v, i) => i + start)
rangeArray(5) // -> [0,1,2,3,4]
范围内的随机整数【借鉴】
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min
randomIntegerInRange(100, 150) // -> 143
范围内的随机数【借鉴】
const randomInRange = (min, max) => Math.random() * (max - min) + min
randomInRange(10,20) // -> 12.27232719315272
JavaScript Hacks的更多相关文章
- Javascript几个时髦的hack技巧《Javascript Hacks for Hipsters》
转自:http://berzniz.com/post/68001735765/javascript-hacks-for-hipsters Javascript Hacks for Hipsters J ...
- CSS/JavaScript hacks,browserhacks使用
1.网址 http://browserhacks.com/ 2.使用 (1)JavaScript Hacks 浏览器js判断 (2)条件注释hack (3)Media Query Hacks 媒体查询 ...
- 各种各样的hack。
http://itakeo.com/blog/2015/11/16/allhack/?none=123 Android Selector Hacks .selector:not(*:root) {} ...
- 使用flexbox来布局web应用
使用 flexbox 可以帮助你设计出引人注目的布局,并且在pc端或移动端能够很好的缩放.告别使用浮动的 <div> 元素.绝对定位 和一些JavaScript hacks, 使用仅仅几行 ...
- 谨慎能捕千秋蝉(一)——XSS
最近在研读<白帽子讲web安全>和<Web前端黑客技术揭秘>,为了加深印象,闲暇之时做了一些总结. 下面是书中出现的一些专有词汇: POC(Proof Of Concept): ...
- 各种奇妙的hack
Android Selector Hacks WebKit .selector:not(*:root) {} Chrome * Safari * Opera ≥ 14 Android * # Java ...
- css兼容处理-hack
浏览器兼容之旅的第二站:各浏览器的Hack写法 Browser CSS Hacks Moving IE specific CSS into @media blocks Detecting browse ...
- [译]送给 ES6 开发者的7个 hack
关注原来的 JavaScript hacks,上面有一些新的好东西.2018 使用 JavaScript 写代码真的又变得有意思了! Hack #1 — 交换变量 使用数组结构来交换值 let a = ...
- 掌握这20个JS技巧,做一个不加班的前端人
摘要:JavaScript 真的是一门很棒的语言,值得学习和使用.对于给定的问题,可以有不止一种方法来达到相同的解决方案.在本文中,我们将只讨论最快的. 本文分享自华为云社区<提高代码效率的 2 ...
随机推荐
- 洛谷P4074 [WC2013]糖果公园(莫队)
传送门 总算会树形莫队了…… 上次听说树形莫队是给树分块,实在看不懂.然后用括号序列的方法做总算能弄明白了 先说一下什么是括号序列,就是在$dfs$的时候,进入的时候记录一下,出去的时候也记录一下 拿 ...
- [USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699
题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...
- Xshell连接不上Ubuntu解决方式
1—— 首先检查一下自己的网络是否正常,如果是插上网线就能用的,就很好:如果是校园网拨号方式上网的,请检查自己是否建立拨号连接. [编辑连接] [添加] PPPOE上网方式选择[DSL] 2—— ...
- my16_sql_thread执行慢导致主从延迟高的一个情景
现象:从库延迟高,查看slave status发现sql_thread执行语句的速度比主库慢,这样的延迟会一直高下去,下面是排查的一些过程1. 检查了从库的配置,磁盘的写入速度的确没有主库高2. io ...
- 第十一章:DOM扩展
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 13-----BBS论坛
BBS论坛(十三) 13.1点击更换图形验证码 (1)front/signup.html <div class="form-group"> <div class= ...
- 用NaviCat创建存储过程批量添加测试数据
打开navicat连接上数据库,然后打开左上角函数,新建一个函数. BEGIN DECLARE i int; --声明变量 DECLARE groupid int; set i=LAST_INSERT ...
- pdf.js使用爬过的坑
最近项目里需要做一个在浏览器直接预览pdf的功能,有些浏览器可以直接预览pdf文件,但是有些不能(不要躲,说的就是你IE)查资料普遍推荐pdf.js,兼容能到ie9,很不错了. 1. 从pdf.js官 ...
- python django 基本测试
http://www.runoob.com/django/django-model.html django-admin startapp TestModel /models.py from djang ...
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 常见问题总结
1. 如何让表头在每页显示(译) A. 打开高级模式: 在分组栏中点击Column Goups右侧的箭头选择高级模式; B. 找到第一个Static组 在Row Groups区域中(注意不是Colu ...