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的更多相关文章

  1. Javascript几个时髦的hack技巧《Javascript Hacks for Hipsters》

    转自:http://berzniz.com/post/68001735765/javascript-hacks-for-hipsters Javascript Hacks for Hipsters J ...

  2. CSS/JavaScript hacks,browserhacks使用

    1.网址 http://browserhacks.com/ 2.使用 (1)JavaScript Hacks 浏览器js判断 (2)条件注释hack (3)Media Query Hacks 媒体查询 ...

  3. 各种各样的hack。

    http://itakeo.com/blog/2015/11/16/allhack/?none=123 Android Selector Hacks .selector:not(*:root) {} ...

  4. 使用flexbox来布局web应用

    使用 flexbox 可以帮助你设计出引人注目的布局,并且在pc端或移动端能够很好的缩放.告别使用浮动的 <div> 元素.绝对定位 和一些JavaScript hacks, 使用仅仅几行 ...

  5. 谨慎能捕千秋蝉(一)——XSS

    最近在研读<白帽子讲web安全>和<Web前端黑客技术揭秘>,为了加深印象,闲暇之时做了一些总结. 下面是书中出现的一些专有词汇: POC(Proof Of Concept): ...

  6. 各种奇妙的hack

    Android Selector Hacks WebKit .selector:not(*:root) {} Chrome * Safari * Opera ≥ 14 Android * # Java ...

  7. css兼容处理-hack

    浏览器兼容之旅的第二站:各浏览器的Hack写法 Browser CSS Hacks Moving IE specific CSS into @media blocks Detecting browse ...

  8. [译]送给 ES6 开发者的7个 hack

    关注原来的 JavaScript hacks,上面有一些新的好东西.2018 使用 JavaScript 写代码真的又变得有意思了! Hack #1 — 交换变量 使用数组结构来交换值 let a = ...

  9. 掌握这20个JS技巧,做一个不加班的前端人

    摘要:JavaScript 真的是一门很棒的语言,值得学习和使用.对于给定的问题,可以有不止一种方法来达到相同的解决方案.在本文中,我们将只讨论最快的. 本文分享自华为云社区<提高代码效率的 2 ...

随机推荐

  1. git pull 命令

    作用:取回远程主机某个分支的更新,再与本地的指定分支合并 格式:git pull  <远程主机名> <远程分支名>:<本地分支名> 1. 如果与当前分支合并,则可省 ...

  2. xPath在C#中运用

    <?xml version="1.0" encoding="utf-8" ?> <pets>   <cat color=" ...

  3. 文件上传之form表单篇

    form表单上传文件 作为本系列的最后一篇,也是楼主知道的第三种文件上传的方式--隆重推出Form表单 这是最传统的上传文件,提交数据的方式 Html: <form action="/ ...

  4. 关于IBOutlet的生命周期

    在调试程序的时候,发现 IBOutlet的对象在执行 getter时,开始一直想找IBOutlet对象getter方法前被执行的代码,但是一直找不到,于是我就想是不是系统自动给IBOutlet 自动初 ...

  5. Step by Step: 基于MFC下的COM组件开发-Helloworld

    http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...

  6. hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)

    题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会 ...

  7. linux 下结合find 和 rm 删除大量文件

    echo "remove only files, the logs folder and it contents will not be removed"find /opt/tra ...

  8. 通过JS,按照原比例控制图片尺寸

    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...

  9. NET CORE Learning

    ASP.NET Core 基础教程https://www.cnblogs.com/lonelyxmas/tag/ASP.NET%20Core%20%E5%9F%BA%E7%A1%80%E6%95%99 ...

  10. js遇到的奇怪问题和坑1

    if(window.confirm('你确定要删除此条信息么')){ // window.open('delete.php'); location.href='delete.php'; return ...