132018.8

其实很简单,substr按字,substring按位:

var str = '我很高兴ho~'
str.substring(str.length - 5, 5) // 高兴h
str.substr(str.length - 5, 5) // 高兴ho~

 

12:06:45 substr和substring的区别 已有0条回复
122018.8

开源已经是软件领域占据绝对主导的一种策略。但是,很不幸,大部分人对开源的认知都无外乎两个点:“免费”“开箱即用”。所谓免费就是说你开源的软件,我不用买许可证,直接用,你的协议最好还是MIT,这样我用起来一点版权顾虑都没有。开源=免费,这几乎成为行业共知。而“开箱即用”则体现在使用者对开源软件的依赖性,它们希望一个开源软件可以按照自己的想法工作,如果不行的情况下,就去给软件作者提issue。实际上,在我看来,“免费软件”和“开源”完全是两个层面的事。开源的真正意义是,让原本封闭的独裁的技术公开,让其他开发者可以从中学习,在自己的产品里使用开源代码里面的思想、思路、甚至是实现方式,而非提供完整的产品免费给人用。但现在行业里面曲解开源精神,以github为主导的开源世界实际上是推崇“开源免费软件”这一完整的概念,而非“开源”概念本身,也就是说,一个开源项目的作者,被要求把这个项目做成一个完整的,其他开发者拿过去就开箱即用的,而且还要有完整文档的,甚至issue反馈即时的项目。这其实是做软件的思路,而非做开源的思路,开源变成了软件的一种分发方式,开源精神本身反而在这种潮流中被淡忘,甚至如果不按这种模式行事的开源项目,还会被数落。开发者不仅不感谢开源者将自己的思想公之于众,反而以形式化的要求去数落他,这样而言,他大可以不开源了,自己好好把项目做好,赚更多钱,而对于那些叫嚣开源项目完整性的人,多半不喜欢去看源码,而喜欢看文档,也就是那类拿来主义而已。

22:58:14 开源的意义不是免费 已有0条回复
102018.8

isObject

08:39:57

JS里面判断一个变量是否为object类型其实比较麻烦,除了array和null会干扰以外,我们知道,所有的衍生数据类型的本质都是object,要想知道一个数据是否是单纯的object,我们就要排除这些干扰,直接检测这个变量的constructor:

function isObject(value) {
  return value && typeof value === 'object' && value.constrcutor === Object
}
已有0条回复
082018.8

终于又重写完一个库,改名为databaxe,是一个前端数据请求管理相关的库,在datamanager.js的基础上修改而来,使用了indexedDB和webworker,是一个现代化的数据请求管理工具。它的理念什么的已经在相关文章里面介绍过了:

这次的改版(改名)是为了简化概念,重新提炼api,并且将同步转化为异步,将之前容易混淆的地方全部修改过,变成单一可理解的api。特别是对get方法进行改造,之前的get方法基于localStorage,是同步的,现在基于indexedDB,是异步的,与数据请求保持一致的行为操作模式,让使用起来更方便新手入门。同时开放了dispatch接口,时它拥有更新本地数据的能力。

要了解这个库移步DataBaxe

00:42:55 DataBaxe上线 已有0条回复
202018.7

《西部世界》整部剧其实想告诉我们到底什么是人工智能,其实人工智能的本质不在于3d打印出来的肉体可以满足游客的肾上腺素刺激,它的本质在于满足人类的最终极欲望:永生。总之它是贪得无厌的人类走向灭亡的走一步。其次,这部剧告诉我们的真相是,人工智能的技术过程,一定是对用户隐私的无误差挖掘,一开始,当剧情发展到后面的时候,我听到说终极武器是收集游客数量时,竟然有些失望,觉得隐私有啥大惊小怪的。但直到我自己去研究智能推荐的时候才明白,用户的数据对智能算法是多么的重要。再联想到这段时间全世界的用户数据滥用问题,真的,那些推崇人工智能的公司,特别是超大公司,都在想尽一切办法把全世界的用户的无误差数据收集起来。所谓无误差是说,不能遗漏掉每一个细节,甚至你在屏幕上滑动的速度都要收集。在这个毫不留情的收集过程中,类似Facebook的事件会越来越多。

14:52:01 西部世界和AI 已有0条回复
162018.7

k = kilo (10^3, thousand)
M = Mega (10^6, million)
G = Giga (10^9, billion)
T = Tera (10^12, trillion)
P = Peta (10^15, quadrillion)
E = Exa (10^18, ??)

16:20:58 2018-07-16 16:20发布的内容 已有0条回复
122018.7

“实现财务自由”已经是一个滥俗到爆的词,今天听到一个更屌爆的词叫实现“言论自由”。当时我们在吃饭,说到李笑来,说他最屌的一句话是“在坐的各位都是傻逼”,大家一笑了之,有人突然说到“这算啥,你看马云,人家想说啥就说啥,这叫实现了言论自由”……听到这句话的时候,我都吓尿了,感觉打开了新世界的大门,我x,原来还有一件事叫“实现言论自由”,什么时候让我财务自由一下先?……

21:20:53 “实现财务自由”的进阶版 已有0条回复
112018.7

这几天真的是下了苦心,把之前的四个包完完整整的重写了一遍,并将作为自己今后开发的开箱必用包,它们分别是hello-events(事件绑定与触发管理),hello-storage(localStorage等本地化存储简化操作),hello-worker(webworker简便使用),hello-indexeddb(超简单indexeddb使用包),接下来打算把之前写的datamanaer.js重写一下,要用hello-什么做名字还没想好,但是肯定会是最完美的前端数据获取模式。完成这个之后,就是要把hst-virtual-dom再重写一遍,把之前写的toex用上,这样就可以让virtual dom这块完美收官了。

01:12:30 Hello World系列 已有0条回复
092018.7

Blob和ArrayBuffer的区别

周末趁没事,就把之前写的一个包重新写了一遍。这个包的作用是为开发者提供更加快捷的indexedDB操作,免除一切烦恼,开箱就用起来。indexedDB是web标准,被大部分现代浏览器完整支持。和localStorage不同的是,indexedDB是真的完整存储js对象的引擎,它甚至支持存储new Date()的值,其他一些基础的js对象类型也可能是支持的。而localStorage是只能存储字符串的,要存储对象,必须通过JSON等进行序列化,而JSON不支持循环嵌套。另外一点就是,localStorage是同步的,indexedDB是异步的。

基于对复杂的indexedDB原生接口进行封装的思路,我发布了hello-indexeddb这个包,可以通过下面这个命令安装

npm install --save hello-indexeddb

完整的文档在github上,可以点击这里阅读。都是key-value数据库,它和localStorage的本质区别在哪里呢?我认为数据库的本质能力是分层检索能力。检索能力对于localStorage简直就是无,它只能通过一个key得到一个value,而且是字符串的。而indexedDB可以通过创建索引进行检索,查询某个object的时候,可以通过主键快速get,也可以通过索引来快速query,这里的索引在代码层面就是一个被记录的object的属性。这看上去好像也没什么,比如我可以通过构造多种变形的key来保存localStorage,然后自己封装一套检索方法来进行查询,甚至我自己构建一套localStorage的索引来快速查询。这当然是可以的,从这点上来讲,indexedDB甚至没有localStorage有优势,因为localStorage是同步的,更直观,而且不会出现事件循环错误,也就不需要事务机制。但是同步有同步的坏处,那就是阻塞页面进程。

读完stackoverflow上的这个讨论后我更加确信localStorage是有局限的,也就是说,它真的真的仅仅适合那些非常小、碎片化的数据存储,而indexedDB才是完整的长久存储数据的解决方案。这也就是说,在一个web应用中,应该合理的选择使用localStorage还是indexedDB。大家之所以那么青睐使用localSotrage,最大的原因莫过于它的接口太过简单了。不过想要让indexedDB变得简单也非常容易,就是使用我上面的包。你甚至可以这么用:

async function() {
let idb = new HelloIndexedDB({ key: 'key' })
await idb.put({ key: 'my_key', value: 'my_value' })
let obj = await idb.get('my_key')
}

就是这么简单,跟localStorage相比,就是异步和同步的区别。在对put这个操作的适合,转换一下localStorage里面的set操作的思维,然后,就非常自然的切换到了indexedDB的怀抱里面。要知道,get回来的,是一个拥有上下文的真实的js对象,而非字符串序列化和反序列化的结果。

就这样,拥抱indexedDB吧~