JavaScript是一款非常强大的脚步语言,它有一些不常用到但却非常神奇的语法,学会来既可以方便快捷实现某些功能,有可以成为高手(装逼),下面我通过几个例子来说明,并讲解其原理:
1、沉睡排序
在了解沉睡排序算法前,我们先看看十大经典排序算法 十大排序算法最终实现效果咱不说,都是为了解决问题同时提示效率。沉睡算法并不是一个高效的算法,相反反而很低效,它是一个特殊的算法,话不多说直接先上代码:
1
2
3
4
5
6var numbers=[1,2,3,6,5,8,4,5,5,66,2,1];
numbers.forEach((num)=>{
setTimeout(()=>{
console.log(num)
},num)
})
这样console输出的结果是已经排序好的,神奇不神奇!
我们知道JavaScript是单线程队列处理机制,而利用使用setTimout指定时间,并不能保证到达指定时间后立即执行,只能保证到达指定时间把事件插入执行队列。
而根据浏览器更新策略 IE8及其之前的IE版本更新间隔为15.6毫秒,目前Chrome与IE9+浏览器的更新频率都为4ms(如果你使用的是笔记本电脑,并且在使用电池而非电源的模式下,为了节省资源,浏览器会将更新频率切换至于系统时间相同(16.7毫秒),也就意味着更新频率更低)。
根据上面的原理,假设浏览器器更新频率和计算器显示器更新频率(60HZ)相同,那么浏览器更新时间约为(16.7毫秒),所以如果 setTimeout(fu,0),实际并不是立刻插入执行队列,而是16.7毫秒之后进入执行队列
根据上面结论我们得出,如果setTimeout时间<=16.7毫秒,那么最好都会按照16.7毫秒来计算。
那么问题来了,回到上面“沉睡排序”算法,[1,2,3,6,5,8,4,5,5,66,2,1] 除了66其他都应该按照16.7毫秒来计算,那么小于16.6的是不应该具有排序效果,原理是这样的。但是事实上浏览器在一个更新队列(16.7ms)插入数据队列进行了优化排序算法,纠正了这种问题。也就是说,在小于16.7数值是的异常排序问题浏览器帮你解决了(开不开心,兴不兴奋)2、快速去重 (ES6)
先上代码:1
var arr = Array.from(new Set([1,2,3,4,4,3,5,6,7,8,8]));
这样得到的数组就是去重之后的数组,为什么会出现这种情况呢,下面让我来给你详细介绍一下:
说起Set就不得不说下Map,Map是通过 key:value 键值对进行存储,看到这里有不少一笑伙伴已经开始有异议了:JavaScript对象{}里面不也是key:value键值对吗?
这是因为JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number,Array,Object或者其他数据类型作为键也是非常合理的。为了解决这个问题,最新的ES6规范引入了新的数据类型Map。(吐槽:啰嗦了一大堆)
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。通过这样的没有重复key实现了数组去重
3、单行写一个评级组件
1 | "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate); |
我们看下运行结果: 看到这个运行结果,下次再用写评级就开心了! 这使用运用特殊字符文本,和slice函数的分段截取特性,不清楚slice怎么用的可以自行google一下
4、论如何优雅的取整
老规矩,先上代码:1
2
3
4
5var a = ~~2.33
var b= 2.33 | 0
var c= 2.33 >> 0
5、短路表达式
1 | var a = b && 1 |