在2015年发布的 ECMAScript(ES6)新增内容很多,花费了将近 6 年(2009-11 至 2015-6)的时间才将其标准化。因此,从 ECMAScript 2016(ES7)开始,版本发布变得更加频繁,每年发布一个新版本,新增内容也会更小,基本只需要花费半个小时就能搞懂了。本文将大致介绍ES7,ES8和ES9的新特性,希望对大家日后采用新版本时有所借鉴。
ES7
ECMAScript 2017特性一览:
- Array.prototype.includes()方法
- 求幂运算符
hello world
我们都知道,通过margin: 0 auto;
,可以很简单的就实现了水平居中,但是我们却不能通过margin: auto;
来实现垂直居中。要在各种环境下实现完美居中,还是一件挺烦人的事情,特别对于新人来说。虽然通过google我们可以很方便的找到一种实现方式,但是如果只会使用而不了解其实现原理的话,是非常不利于我们学习的。下面我们就来一一探索常见的6种实现方式的奥秘。
由于之前苹果公司限制所以应用必须在17年1月1号前开启ATS(后面推迟了deadline,可能是太多应用都还没有开启吧:sweat:),所以最近一直都在研究HTTPS协议。趁这个机会,在这段时间内我也将自己的博客迁移到HTTPS。因此做个分享,希望能够帮助到后面需要迁移的同学。
现在,前端的页面和功能越来越复杂,为了复用或者减少复杂度,开发人员经常将页面拆分成多个部分,也就是模块,每个模块负责相对独立的功能,通过组合不同的模块来实现业务需求。
但是这种方式会带来另外一个问题,就是浏览器并行加载的数量有限,如果这些模块都是单独的一个js或者css文件,就会影响到整个页面的加载效率。
因此如果能够将多个相互依赖相互关联的文件合并成一个文件,就可以无痛解决这个问题,而这也就是webpack的功能。
webpack是一种模块化的解决方案。所有的文件,对于webpack来说,通过组合合适的loader,都可以当做模块来处理,包括JavaScript代码,CSS和fonts,以及多媒体资源等。
程序员的学习之路上,提高自己的技术水平的一种非常有效的方式,就是分析和学习优秀的项目代码。在CSS Serials系列的文章,我会从自己的角度来分析这些项目实现的原理,并进行一定的扩展,希望能够对阅读这些文章的你有所帮助。
今天分析的项目是使用CSS3輕鬆寫出MAC彩虹球效果,一个纯CSS实现彩虹球效果的项目。
通常我们只能通过抓包的方式来抓取和查看手机设备上发送的网络请求。
抓包这种方式,必须保证电脑和手机设备处于同一个网络。
比如常遇到的运营商HTTP劫持(如果只在个别运营商网络下才会出现问题,常常就是遇到了运营商HTTP劫持),这种情况下要通过抓包的方式来定位问题是非常麻烦的。
目前我们能使用的解决方法,通常是通过手机设备打开网络热点,电脑通过该热点来连接网络,再进行抓包。另外每次都要通过电脑才能查看,也是非常的麻烦。
Git是目前最为流行的版本控制系统,我们程序员几乎每天都需要跟Git打交道。再小心谨慎的人,都免不了犯错。可能在你刚刚commit之后,突然虎躯一震,大呼:“我擦,提交错了,有Bug”。幸好有了Git,幸好Git为我们提供各种强大的“后悔药”,来帮我们应对各种场景。接下来,就让我们来详细了解下吧。It‘s showtime。
这篇博文是Java Concurrency系列博文的第三篇,主要来探索Java中多线程常用到的一些集合类,包括ConcurrentHashMap和BlockingQueue。通过对部分源代码的分析,希望能够帮助理解这些集合类的机制和特点,以便把握他们的正确使用场景。
PS:部分内容参考了Java并发编程之ConcurrentHashMap
ConcurrentHashMap
是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap
可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap
加锁。
ConcurrentHashMap
为了提高本身的并发能力,在内部采用了一个叫做Segment
的结构,一个Segment
其实就是一个类Hash Table的结构,Segment内部维护了一个链表数组,我们用下面这一幅图来看下ConcurrentHashMap
的内部结构:
这篇博文是Java Concurrency系列博文的第二篇。在这篇博文,我们将会来共同探索Java多线程编程中常用到的机制,包括Latch、Barrier、Future和Semaphore。
PS:本文主要参考了Java Concurrentcy in Pratice一书,如有纰漏,请谅解。
AtomicBoolean - 可原子更新的布尔变量
AtomicInteger - 可原子更新的int变量
AtomicIntegerArray - int数组,包含的元素都是可原子更新的
AtomicIntegerFieldUpdater<T> - 基于反射的实用工具,可以对指定类的指定volatile int字段进行原子更新
AtomicLong - 可原子更新的long变量
AtomicLongArray - long数组,包含的元素都是可原子更新的
AtomicLongFieldUpdater<T> - 基于反射的实用工具,可以对指定类的指定volatile long字段进行原子更新。用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制。
AtomicMarkableReference<V> - 将对象引用关联一个标记比特,可原子更新
AtomicReference<V> - 可原子更新的对象引用
AtomicReferenceArray<E> - 对象引用数组,包含的元素都是可原子更新的
AtomicReferenceFieldUpdate<T, V> - 基于反射的实用工具,可以对指定类的指定volatile引用字段进行原子更新
AtomicStampedReference<V> - 将对象引用关联一个integer“标签”,可原子更新
java.util.concurrent.atomic包所提供的类,不基于锁机制,实现单一变量的线程安全。这个包中的类,在volatile变量、属性和数组元素的基础上,增加了原子条件更新操作:boolean compareAndSet(expectedValue, updateValue);
。这个方法可以原子更新某个变量。如果这个变量当前的值是expectedValue
,就会将一个变量设置为updateValue
。如果成功更新,则会返回true
。这个包中的类同样提供了一些获取和非条件设置变量方法,以及弱条件原子更新操作weakComparedAndSet
。