技术最前端,专注 Web 技术学习与总结。JavaScript, JS, ES6, TypeScript, Vue, PHP, CSS3, Html5, Node, Git, Markdown 等技术文章。
我已经使用 TypeScript 超过四年了,总的来说,这是一次非常棒的体验。随着时间的推移,使用它的摩擦逐渐减少,直到完全消失,这使得我在编写类型或以类型优先的方式解决问题时变得更加高效。虽然我还远未成为真正的类型大师,但我敢说自己已经熟练掌握了这门语言,经历了类型体操、条件类型、嵌套泛型,并深刻理解了 type
和 interface
之间的神圣差异。说实话,我认为我对这门语言已经有了相当不错的理解。
直到我发现我错了。其实,有一个关于 TypeScript 的特定问题我完全理解错了,我相信你也可能犯过同样的错误。而这并不是某个你从未听说过、可能永远不会用到的复杂边缘案例。恰恰相反,这是你和其他所有 TypeScript 开发者直接交互过数百次的东西,一直在我们眼前游弋。
软件也像人一样,具有生命力,从出生到死亡,会经历多种变化。软件架构设计也不是一蹴而就的,是不断地演进发展。每个程序员都可以从理解编程原则和模式中受益。
软件设计原则是一组帮助我们避开不良设计的指导方针。根据 Robert Martin
下面这些软件设计原则是我从一些书籍和网络中收集而来,并不完整,而且你也需要在一些有「冲突的原则」之间进行权衡和取舍。本文或许会对你的编程、程序设计、讨论或评审工作有所帮助。
异步编程一直是 JS 的核心之一,业界也是一直在探索不同的解决方法,从「回调地狱」到发布订阅模式,再到 Promise
,都是在优化异步编程。尽管 Promise
已经很优秀了,也不会陷入「回调地狱」,但是嵌套层数多了也会有一连串的 then
,始终不能像同步代码那样直接往下写就行了。Generator
是 ES6 引入的进一步改善异步编程的方案,下面我们先来看看基本用法。
首先,使用 JavaScript 语言,写一个可执行脚本 hello
#!/usr/bin/env node
console.log('hello world');
然后,修改 hello 的权限:
chmod 755 hello
现在,hello 就可以执行了:
$ ./hello
hello world
浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。
浏览器缓存的优点有:
减少了冗余的数据传输,节省了网费
减少了服务器的负担,大大提升了网站的性能
加快了客户端加载网页的速度
~
对每一个比特位执行非(NOT)操作。NOT a 结果为 a 的反转(即反码)。
var num = ~4;
console.log(a); // -5
解析:
4 的二进制数为 100,补满32位
00000000000000000000000000000100
按位取反
11111111111111111111111111111011
由于32位开头第一个是 1,所以这是一个负数,将二进制转换成负数,需要先反码
00000000000000000000000000000100
之后,再+1
00000000000000000000000000000101
转换成十进制为 5,加上符号变成负数 -5
加减法
var a = 1,
b = 2;
a = a + b;
b = a - b;
a = a - b;
console.log(a, b); // 2, 1
function commafy(num) {
num = num + '';
var reg = /(-?\d+)(\d{3})/;
while(reg.test(num)) {
num = num.replace(reg, '$1,$2');
}
return num;
}
-webkit-text-size-adjust
是为了保持网页字体大小的一个属性,因为有些网页的字体缩小以后,难以识别,并且也严重影响到用户体验,如果在全局定义了 html { -webkit-text-size-adjust: none; }
会导致另一个现象:浏览器一般提供给小群体用户一个功能,就是放大与缩小网页视图。禁用了这一属性,在 chrome 下放大网页,会导致其它元素均放大,而文字却依然为原定义的 12px。